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

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

解题思路:

设字符串p的长度为k,在字符串s上维护一个大小为k的滑动窗口。判断滑动窗口里的字符串和p是否是异位词。通过统计字符串P中每一个字符出现的次数来判断单词是否是异位词。利用哈希表来记录每个单词出现的次数,当滑动窗口移动的时候注意更新移除窗口的单词的出现个数。

代码:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
      vector<int> ans;
      if (s.size() < p.size()) return ans;
      int k = p.size(), n = s.size(); //维护一个大小为k的滑动窗口
      vector<int> s_table(26);
      vector<int> p_table(26);
      for (int i = 0; i < k; ++ i) {
        ++s_table[s[i] - 'a'];
        ++p_table[p[i] - 'a'];
      }
      if (s_table == p_table) ans.emplace_back(0);
      for (int i = k; i < n; ++ i) {
        --s_table[s[i - k] - 'a'];
        ++s_table[s[i] - 'a'];
        if (s_table == p_table) ans.emplace_back(i - k + 1);
      }
      return ans;
    }
};

posted on 2022-04-04 19:06  翔鸽  阅读(16)  评论(0编辑  收藏  举报