原题:
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。快一些。