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

目录

  • 一、题目
  • 二、思路
    • 2.1 解题思路
    • 2.2 代码尝试
    • 2.3 疑难问题
  • 三、解法
  • 四、收获

一、题目

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

二、思路

2.1 解题思路

如何判断异位词?怎样的数据结构能够维护这个abc异位词?->哈希表
用两个哈希表来比较字符

2.2 代码尝试

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        hash_map;
        hash_map_p;
        vector<int> out;
        for(){
            hash_map_p.emplace();
        }
        for(int i=0;){
            hash_map.emplace();
            if(hash_map==hash_map_p){
                out.emplace(hash_map.second)
            }
        }

    }
};

2.3 疑难问题

有一点思路,但是写起来有点困难,哈希表生疏了。
如何创建哈希表?已经忘记了

三、解法

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int sLen = s.size(), pLen = p.size();

        if (sLen < pLen) {
            return vector<int>();
        }

        vector<int> ans;
        vector<int> sCount(26);
        vector<int> pCount(26);
        for (int i = 0; i < pLen; ++i) {
            ++sCount[s[i] - 'a'];
            ++pCount[p[i] - 'a'];
        }

        if (sCount == pCount) {
            ans.emplace_back(0);
        }

        for (int i = 0; i < sLen - pLen; ++i) {
            --sCount[s[i] - 'a'];
            ++sCount[s[i + pLen] - 'a'];

            if (sCount == pCount) {
                ans.emplace_back(i + 1);
            }
        }

        return ans;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/solutions/1123971/zhao-dao-zi-fu-chuan-zhong-suo-you-zi-mu-xzin/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

四、收获

哈希表就是用vector将字母映射到0-26的数组中。利用s[i]-‘a’,哈希表的比较就是数组是否相同,=
滑动窗口一般都需要有一个数据结构来动态维护,之前已经碰到过了用优先队列(大根堆),这次是哈希表,后面如果需要有变体的话,估计也就是换换数据结构,改改逻辑判断。大致的解题思路差不多。

你可能感兴趣的:(#,算法和leetcode,算法)