每日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 仅包含小写字母
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {

    }
};

解析及代码1

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

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int hash1[26] = { 0 }, hash2[26] = { 0 };
        for (auto& e : p)
        {
            hash2[e - 'a']++;
        }
        int left = 0, right = 0, n1 = s.size(), n2 = p.size();

        vector<int> ret;
        if(n2 > n1)
            return ret;
        while (right < n2)
        {
            hash1[s[right++] - 'a']++;
        }
        while (right < n1)
        {
            int j = 0;
            for (; j < 26; ++j)
            {
                if (hash1[j] != hash2[j])
                {
                    break;
                }
            }
            if (j == 26)
            {
                ret.push_back(left);
            }
            hash1[s[right++] - 'a']++;
            hash1[s[left++] - 'a']--;
        }
        int j = 0;
        for (; j < 26; ++j) // 再判断一遍
        {
            if (hash1[j] != hash2[j])
            {
                break;
            }
        }
        if (j == 26)
        {
            ret.push_back(left);
        }
        return ret;
    }
};

解析及代码2

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

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int hash1[26] = { 0 }, hash2[26] = { 0 };
        for (auto& e : p)
        {
            hash2[e - 'a']++;
        }
        int left = 0, right = 0, n1 = s.size(), n2 = p.size(), count = 0;

        vector<int> ret;
        if(n2 > n1)
            return ret;

        while (right < n1)
        {
            char in = s[right];
            if(++hash1[in - 'a'] <= hash2[in - 'a'])
            {
                ++count;  // 进窗口和维护count
            }

            if(right - left + 1 > n2) // 判断
            {
                char out = s[left++];
                if(hash1[out - 'a']-- <= hash2[out - 'a'])
                {
                    --count; // 出窗口和维护count
                }
            }

            if (count == n2) // 更新结果
            {
                ret.push_back(left);
            }
            ++right;
        }
        return ret;
    }
};

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-21 05:58:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-21 05:58:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-21 05:58:02       82 阅读
  4. Python语言-面向对象

    2024-01-21 05:58:02       91 阅读

热门阅读

  1. 【算法详解】力扣240.搜索二维矩阵II

    2024-01-21 05:58:02       41 阅读
  2. 【算法题】66. 加一

    2024-01-21 05:58:02       45 阅读
  3. AI辅助编程工具—Github Copilot

    2024-01-21 05:58:02       60 阅读
  4. unity 矩阵探究

    2024-01-21 05:58:02       43 阅读
  5. 关于搭建Devops平台的高级运维面试题

    2024-01-21 05:58:02       46 阅读
  6. 代码随想录算法训练营Day22 | 二叉树part08

    2024-01-21 05:58:02       66 阅读
  7. 自定义服务自启动失败

    2024-01-21 05:58:02       49 阅读
  8. 如何在Node.js将console日志写入到文件

    2024-01-21 05:58:02       54 阅读
  9. 2401vim,vim标号

    2024-01-21 05:58:02       43 阅读
  10. uniapp中的uni-row/uni-col上的click点击无效

    2024-01-21 05:58:02       52 阅读