【解题报告】Leecode 438. 找到字符串中所有字母异位词——Leecode每日一题系列
生活随笔
收集整理的這篇文章主要介紹了
【解题报告】Leecode 438. 找到字符串中所有字母异位词——Leecode每日一题系列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天是堅持每日一題打卡的第二十七天
題目鏈接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/
題解匯總:https://zhanglong.blog.csdn.net/article/details/121071779
題目描述
給定兩個字符串 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 * 104
s 和 p 僅包含小寫字母
滑動窗口 + 哈希表解法
以往滑動窗口是采用隊列構建,但這次采用了哈希表構建
原因是:題意要求符合條件的子串,順序可以不同,因此采用統計詞頻(個數)來判斷相等的方法。
步驟:
注意:滑動窗口的邊界值問題
class Solution { public:vector<int> findAnagrams(string s, string p) {int sLen = s.size(), pLen = p.size();if (sLen < pLen) return {};vector<int> sArr(26);vector<int> pArr(26);vector<int> res;for (int i = 0; i < p.size(); i++) {++sArr[s[i]-'a'];++pArr[p[i]-'a'];}if (sArr == pArr) res.push_back(0);for (int i = 0; i < sLen - pLen; i++) {// 窗口右移sArr[s[i]-'a']--;sArr[s[i+pLen]-'a']++;if (sArr == pArr) res.push_back(i + 1);}return res;} };
總結
以上是生活随笔為你收集整理的【解题报告】Leecode 438. 找到字符串中所有字母异位词——Leecode每日一题系列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【解题报告】Leecode 700. 二
- 下一篇: 【解题报告】Leecode 519. 随