leetcode 438.Find All Anagrams in a String

来源:互联网 发布:圆方软件论坛 编辑:程序博客网 时间:2024/06/16 16:36

原题:

Given a string s and a non-empty string p, find all the start indices of p's anagrams in s.

Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.

The order of output does not matter.

Example 1:

Input:s: "cbaebabacd" p: "abc"Output:[0, 6]Explanation:The substring with start index = 0 is "cba", which is an anagram of "abc".The substring with start index = 6 is "bac", which is an anagram of "abc".

Example 2:

Input:s: "abab" p: "ab"Output:[0, 1, 2]Explanation:The substring with start index = 0 is "ab", which is an anagram of "ab".The substring with start index = 1 is "ba", which is an anagram of "ab".The substring with start index = 2 is "ab", which is an anagram of "ab".
找出顺序不同的小写字母排序。

第一次的想法非常简单,就是逐个拿出来进行排序,然后比较就好。结果超时了。

/** * Return an array of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */int* findAnagrams(char* s, char* p, int* returnSize) {    int slen=strlen(s);    int cmp(const void* a,const void* b)    {        return *(char*)a-*(char*)b;    }    int plen=strlen(p);    if(slen<plen)        return NULL;    int* result;    result=(int*)malloc(sizeof(int)*slen);    qsort(p,plen,sizeof(char),cmp);    char *sample;    sample=(char*)malloc(sizeof(char)*plen);    for(int n=0;n+plen<=slen;n++)    {        strncpy(sample,s+n,plen);        qsort(sample,plen,sizeof(char),cmp);        if(strstr(sample,p)!=NULL)        {            *(result+*returnSize)=n;            (*returnSize)++;        }    }    return result;}

虽然看起来很简单,但是效率比较差。

所以有了第二种。。。

就是自己做特征运算。

/** * Return an array of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */int* findAnagrams(char* s, char* p, int* returnSize) {    int slen=strlen(s);    int cmp(const void* a,const void* b)    {        return *(char*)a-*(char*)b;    }    int plen=strlen(p);    if(slen<plen)        return NULL;    int* result;    result=(int*)malloc(sizeof(int)*slen);    int* pventor;    pventor=(int *)malloc(sizeof(int)*26);    memset(pventor,0,sizeof(int)*26);    for(int n=0;n<plen;n++)    {        int t=(int)*(p+n)-97;        (*(pventor+t))++;        //printf("P%d,",t);    }    bool flag;    int* sventor;    for(int n=0;n+plen<=slen;n++)    {        flag=false;        sventor=(int *)malloc(sizeof(int)*26);        memset(sventor,0,sizeof(int)*26);        for(int m=0;m<plen;m++)        {            int t=*(s+m+n)-97;            (*(sventor+t))++;            //printf("S%d,",t);        }        for(int m=0;m<26;m++)        {            //printf("L%d,%d,",*(pventor+m),*(sventor+m));            if(*(pventor+m)!=*(sventor+m))            {                flag=false;                break;            }            flag=true;        }        if(flag==true)        {            *(result+*returnSize)=n;            (*returnSize)++;        }    }    return result;}
这个在memset上写错了,直接写的26也是蠢到家了。。。 调试了好久才发现。

不过这个从时间上少了一个logn。快一些。


原创粉丝点击