(字符串)字串变位词

题目:

给定两个串a和b,问b是否是a的子串的变位词,例如输入a=hello,b=lel,lle,ello都是true,但b=elo是false。(字串是连续的)

思路:

  • 滑动窗口思想:动态维护一个“窗口”,比如b的长度是3,考察a[0..2],a[1..3],a[2..4]是否是b的变位词,关键在于如何与b比较?
  • hash数组统计:基于字符的特殊性,可以用[0,255]的数组来统计字符出现的次数,假设都是小写的英文字母,则用[0,25]来表示b中每个单词出现的次数,通过记录非0次出现的个数nonZero。
  • 窗口滑动,向右移动一位:

新窗口 a[i-lenb+1…i],旧窗口 a[i-lenb…i-1]

扔掉a[i-lenb],加入a[i],具体操作参考代码,文字表达不清。

代码:

#include <iostream>
#include <vector>

using namespace std;

#define NUM 26

bool variable_bit_word(char *a,int lena,char *b,int lenb){
    vector<int> cnt(26,0);
    int nonZero=0;
    // statistic of b
    for(int i=0;i<lenb;i++){
        if(++cnt[b[i]-‘a‘]==1) nonZero++;
    }
    // first slide window
    for(int i=0;i<lenb;i++){
        int c=a[i]-‘a‘;
        --cnt[c];
        if(cnt[c]==0) nonZero--;
        if(cnt[c]==-1) nonZero++;
    }

    if(nonZero==0)
        return true;

    for(int i=lenb;i<lena;i++){
        int c=a[i-lenb]-‘a‘;
        ++cnt[c];
        if(cnt[c]==1) nonZero++;
        if(cnt[c]==0) nonZero--;
        c=a[i]-‘a‘;
        --cnt[c];
        if(cnt[c]==0) nonZero--;
        if(cnt[c]==-1) nonZero++;

        if(nonZero==0) return true;
    }

    return false;
}

int main()
{
    char a[]="hello";
    char b[]="lel";
    int lena=sizeof(a)/sizeof(a[0])-1;
    int lenb=sizeof(b)/sizeof(b[0])-1;
    cout<<variable_bit_word(a,lena,b,lenb)<<endl;
    return 0;
}
时间: 2024-10-10 08:24:26

(字符串)字串变位词的相关文章

005推断两个字符串是否是变位词 (keep it up)

写一个函数推断两个字符串是否是变位词. 变位词(anagrams)指的是组成两个单词的字符同样,但位置不同的单词.比方说, abbcd和abcdb就是一对变位词 这也是简单的题. 我们能够排序然后对照, 也能够直接统计字符出现的个数来推断.这里给出统计字符来推断的代码: bool isAnagram1(const string& vLeft, const string& vRight) { if (vLeft.size() != vRight.size()) return false; i

CareerCup之1.4判断字符串是否为变位词

[题目] 原文: 1.4 Write a method to decide if two strings are anagrams or not. 译文: 写一个函数判断两个字符串是否是变位词. [分析] 变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词.比如说, abbcd和abcdb就是一对变位词.该题目有两种思路: [思路一] 由于变位词只是字母的顺序改变,字符长度,字符种类没有改变,所以根据此我们只要重新根据字典序排序一下,两个字符串也就一样了. The eyes

判断两个字符串是否是变位词 (keep it up)

写一个函数判断两个字符串是否是变位词.变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词.比如说, abbcd和abcdb就是一对变位词 这也是简单的题. 我们可以排序然后对比, 也可以直接统计字符出现的个数来判断.这里给出统计字符来判断的代码: bool isAnagram1(const string& vLeft, const string& vRight) { if (vLeft.size() != vRight.size()) return false; in

数据结构中计算字符串字串个数

子串是一个字符串中连续的一段,可以把它抽象为在字符串中插入两条边界线截取子串,如"abcde"->"a|bc|de" 两个**"|"**截取一个子串 第一步:选第一个**"|"**,共有 n+1 个选项 第二步:选取第二个**"|"**,共有 n个选项 因此共有 n(n+1)* 个字符串,但是 因为第二步的"|"也可以当第一步的"|",而字符串没有变过,所以有

9.11排序与查找(二)——对字符串数组进行排序,将所有的变位词排在相邻的位置

/** * 功能:对字符串数组进行排序,将所有的变位词排在相邻的位置. */ 两种方法: 方法一: /** * 思路:套用排序算法,并修改比较器.这里比较器用来指示两个字符串胡伟变位词就是相等的. * @param array */ public static void sort(String[] array){ Arrays.sort(array, new AnagramComparator()); } class AnagramComparator implements Comparator

C语言:自定义一个查找字串的功能函数,类似于&lt;string.h&gt;中的strstr()

//自定义一个字符串字串查找标准库函数strstr() #include<stdio.h> #include<string.h> char* myStrstr(char *str1,char *str2); int main() { char *str1 = "hello worl world ld"; char *str2 = " world "; puts(myStrstr(str1,str2)); return 0; } char *m

变位词的查找(上)

本文也同步发表在我的公众号"我的天空" 这次我们聊一个比较有意思的话题:变位词的查找,这个话题在<编程珠玑>中出现,此书很经典,偏向于算法,大家如果能通读的话,肯定受益匪浅!   什么是变位词 不同的单词,如果其组成的字母相同的话,那么这些单词就互为变位词,譬如pots.stop. tops这三个单词就是互为变位词,都是由字母p.o.t.s组成,但是"pot" 就不与上述单词互为变位词,其缺少字母s,"potss"也不是,其多了一个字

[Swust 549]--变位词(vector水过)

Time limit(ms): 1000 Memory limit(kb): 65535 Description 输入N和一个要查找的字符串,以下有N个字符串,我们需要找出其中的所有待查找字符串的变位词(例如eat,eta,aet就是变位词)按字典序列输出,并且输出总数目 Input 第一行:N(代表共有N个字符串属于被查找字符串) (N<=50) 第二行:待查找的字符串(不大于10个字符) 以下N行:被查找字符串(不大于10个字符) Output 按字典序列输出在被查找字符串中待查找字符串的所

写一个函数对字符串数组排序,使所有变位词都相邻

题目 写一个函数对字符串数组排序,使得所有的变位词都相邻. 解答 首先,要弄清楚什么是变位词.变位词就是组成的字母相同,但顺序不一样的单词. 比如说:live和evil就是一对变位词.OK,那么这道题目的意思就很清楚了, 它并不要求我们将字符串数组中的字符串按字典序排序,否则我们直接调用STL中的sort 函数就可以了.它要求我们在排序的过程中,按照变位词的准则来排序. 这种情况下,我们还是可以调用sort函数,不过要自己写一个对比函数. 一般情况下我们如果要排序一个长度为n的数组A,我们可以这