当前位置:   article > 正文

每日OJ题_算法_滑动窗口⑥_力扣438. 找到字符串中所有字母异位词

每日OJ题_算法_滑动窗口⑥_力扣438. 找到字符串中所有字母异位词

目录

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

解析及代码1

解析及代码2


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

438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

难度 中等

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

 示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

提示:

  • 1 <= s.length, p.length <= 3 * 10^4
  • s 和 p 仅包含小写字母
  1. class Solution {
  2. public:
  3. vector<int> findAnagrams(string s, string p) {
  4. }
  5. };

解析及代码1

首先用两个数组做哈希表敲出来的代码:

  1. class Solution {
  2. public:
  3. vector<int> findAnagrams(string s, string p) {
  4. int hash1[26] = { 0 }, hash2[26] = { 0 };
  5. for (auto& e : p)
  6. {
  7. hash2[e - 'a']++;
  8. }
  9. int left = 0, right = 0, n1 = s.size(), n2 = p.size();
  10. vector<int> ret;
  11. if(n2 > n1)
  12. return ret;
  13. while (right < n2)
  14. {
  15. hash1[s[right++] - 'a']++;
  16. }
  17. while (right < n1)
  18. {
  19. int j = 0;
  20. for (; j < 26; ++j)
  21. {
  22. if (hash1[j] != hash2[j])
  23. {
  24. break;
  25. }
  26. }
  27. if (j == 26)
  28. {
  29. ret.push_back(left);
  30. }
  31. hash1[s[right++] - 'a']++;
  32. hash1[s[left++] - 'a']--;
  33. }
  34. int j = 0;
  35. for (; j < 26; ++j) // 再判断一遍
  36. {
  37. if (hash1[j] != hash2[j])
  38. {
  39. break;
  40. }
  41. }
  42. if (j == 26)
  43. {
  44. ret.push_back(left);
  45. }
  46. return ret;
  47. }
  48. };

解析及代码2

改进:用一个变量count维护判断逻辑

  1. class Solution {
  2. public:
  3. vector<int> findAnagrams(string s, string p) {
  4. int hash1[26] = { 0 }, hash2[26] = { 0 };
  5. for (auto& e : p)
  6. {
  7. hash2[e - 'a']++;
  8. }
  9. int left = 0, right = 0, n1 = s.size(), n2 = p.size(), count = 0;
  10. vector<int> ret;
  11. if(n2 > n1)
  12. return ret;
  13. while (right < n1)
  14. {
  15. char in = s[right];
  16. if(++hash1[in - 'a'] <= hash2[in - 'a'])
  17. {
  18. ++count; // 进窗口和维护count
  19. }
  20. if(right - left + 1 > n2) // 判断
  21. {
  22. char out = s[left++];
  23. if(hash1[out - 'a']-- <= hash2[out - 'a'])
  24. {
  25. --count; // 出窗口和维护count
  26. }
  27. }
  28. if (count == n2) // 更新结果
  29. {
  30. ret.push_back(left);
  31. }
  32. ++right;
  33. }
  34. return ret;
  35. }
  36. };
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/85012
推荐阅读
相关标签
  

闽ICP备14008679号