📜  C测验– 110 |问题3(1)

📅  最后修改于: 2023-12-03 15:30:15.339000             🧑  作者: Mango

C测验– 110 |问题3

题目描述:

给定一个字符串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格式:

C测验– 110 |问题3
题目描述:

给定一个字符串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;
}