llllmz

导航

438. 找到字符串中所有字母异位词C

今天出成绩了,感觉徘徊在被刷的边缘,要好好努力了。

这题我想法试建立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;
}

结果:

posted on 2024-02-26 16:26  神奇的萝卜丝  阅读(21)  评论(0)    收藏  举报