滑动窗口——20200103

6、 Leetcode567.字符串的排列
6.1 题目描述
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
换句话说,第一个字符串的排列之一是第二个字符串的子串。
示例1:
输入: s1 = “ab” s2 = “eidbaooo”
输出: True
解释: s2 包含 s1 的排列之一 (“ba”).

示例2:
输入: s1= “ab” s2 = “eidboaoo”
输出: False

注意:
输入的字符串只包含小写字母
两个字符串的长度都在 [1, 10,000] 之间
6.2 思路
在s2的s1的框口大小内存在着与s1的所有相同数量的字母
6.3 代码
bool judge(int s1[26], int s2[26]) {
int i = 0;
for(i = 0; i < 26; i++) {
if(s1[i] != s2[i]) {
return false;
}
}
return true;
}

//思路:在s2的s1的框口大小内存在着与s1的所有相同数量的字母
bool checkInclusion(char * s1, char * s2){
if(s1 == NULL || s2 == NULL) {
return false;
}

int s1Len = strlen(s1);
int s2Len = strlen(s2);
if(s1Len > s2Len) {
    return false;
}

int s1Cnt[26] = {0};
int s2Cnt[26] = {0};
int i = 0, j = 0, k = 0;
for(i = 0; i < s1Len; i++) {
    s1Cnt[s1[i] - 'a']++;
}

int left = 0; //left和right保证等于s1长度
int right = 0;
for(i = 0; i < s2Len - s1Len + 1; i++) {
    left = i;
    right = i + s1Len - 1;
    if(right >= s2Len) {
        break;
    }
    if(left == 0) {
        for(j = left; j <= right; j++) {
            s2Cnt[s2[j] - 'a']++;
        }
    }
    else {
        s2Cnt[s2[right] - 'a']++;
        s2Cnt[s2[left - 1] - 'a']--;
    }

    if(judge(s1Cnt, s2Cnt)) {
        return true;
    }
}

return false;

}

发布了39 篇原创文章 · 获赞 1 · 访问量 856

猜你喜欢

转载自blog.csdn.net/weixin_42268479/article/details/103822953