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;
}