📅  最后修改于: 2023-12-03 15:30:15.339000             🧑  作者: Mango
题目描述:
给定一个字符串s和一个目标字符串t,设计一个算法,查找s中是否存在t的排列之一。
举例:
输入:s = "eidbaooo", t = "ab" 输出:true 解释:s中存在ab的排列之一:"ba"。
输入:s = "eidboaoo", t = "ab" 输出:false
解题思路:
我们可以使用滑动窗口的方法来解决这个问题。
1.使用两个哈希表,一个表示目标字符串t中每个字符出现的次数,另一个表示滑动窗口内的每个字符出现的次数。
2.使用right作为滑动窗口的右端点,left作为滑动窗口的左端点。一开始left和right都指向字符串s的开头。
3.循环中,每次将right向右滑动一个位置,更新哈希表。
4.如果发现当前字符不在目标字符串t中,那么left右移,直到当前窗口内所有字符都在目标字符串t中为止。同时要更新哈希表。
5.判断当前窗口是否符合要求。若符合,返回true。否则继续滑动。
6.如果right已经滑动至字符串s的末尾,结束循环,返回false。
代码片段:
bool checkInclusion(char *s, char *t) {
int left = 0, right = 0;
int s_len = strlen(s);
int t_len = strlen(t);
int s_map[26] = {0}, t_map[26] = {0};
if (s_len < t_len) {
return false;
}
while (right < s_len) {
if (t_map[s[right] - 'a'] > 0) {
s_map[s[left] - 'a']--;
left++;
} else {
s_map[s[right] - 'a']++;
right++;
}
if (right - left == t_len) {
if (memcmp(s_map, t_map, sizeof(s_map)) == 0) {
return true;
}
s_map[s[left] - 'a']--;
left++;
}
}
return false;
}
返回markdown格式:
给定一个字符串s和一个目标字符串t,设计一个算法,查找s中是否存在t的排列之一。
举例:
输入:s = "eidbaooo", t = "ab" 输出:true 解释:s中存在ab的排列之一:"ba"。
输入:s = "eidboaoo", t = "ab" 输出:false
我们可以使用滑动窗口的方法来解决这个问题。
1.使用两个哈希表,一个表示目标字符串t中每个字符出现的次数,另一个表示滑动窗口内的每个字符出现的次数。
2.使用right作为滑动窗口的右端点,left作为滑动窗口的左端点。一开始left和right都指向字符串s的开头。
3.循环中,每次将right向右滑动一个位置,更新哈希表。
4.如果发现当前字符不在目标字符串t中,那么left右移,直到当前窗口内所有字符都在目标字符串t中为止。同时要更新哈希表。
5.判断当前窗口是否符合要求。若符合,返回true。否则继续滑动。
6.如果right已经滑动至字符串s的末尾,结束循环,返回false。
bool checkInclusion(char *s, char *t) {
int left = 0, right = 0;
int s_len = strlen(s);
int t_len = strlen(t);
int s_map[26] = {0}, t_map[26] = {0};
if (s_len < t_len) {
return false;
}
while (right < s_len) {
if (t_map[s[right] - 'a'] > 0) {
s_map[s[left] - 'a']--;
left++;
} else {
s_map[s[right] - 'a']++;
right++;
}
if (right - left == t_len) {
if (memcmp(s_map, t_map, sizeof(s_map)) == 0) {
return true;
}
s_map[s[left] - 'a']--;
left++;
}
}
return false;
}