今天出成绩了,感觉徘徊在被刷的边缘,要好好努力了。
这题我想法试建立hash映射成有序的数字,只要字符串个数相同,并且映射和相同那么就是异位串。
后来这个想法是错的。以为假设已经已知一个和,和组成这个和的个数,但这个子数并不唯一,比如10=1+2+7。10=2+3+5。
这样就会误判。就算能找到唯一的映射方法,那也是一个完全大大超出这个题目难度的数学难题了。
然后学到滑动数组的做法。
用数组来记录当前串里的字母个数。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int fhash(char c){
return c-'a';
}
bool judge(int t[],int tp[]){
for(int i=0;i<26;i++){
if(t[i]!=tp[i]) return false;
}
return true;
}
int* findAnagrams(char * s, char * p, int* returnSize){
int psize=0;
int ssize=0;
while(s[ssize]!=0) ssize++;
while(p[psize]!=0) psize++;
int n=0;
int* a=(int*)malloc(sizeof(int)*ssize);
if(psize <= ssize){
int tp[26]={0};
int t[26]={0};
for(int i=0;i<psize;i++){
t[fhash(s[i])]++;
tp[fhash(p[i])]++;
}
if(judge(t,tp)){
a[0]=0;
n++;
}
for(int i=1;i<ssize-psize+1;i++){
t[fhash(s[i-1])]--;
t[fhash(s[i+psize-1])]++;
if(judge(t,tp)){
a[n++]=i;
}
}
}
*returnSize=n;
return a;
}
结果: