zoukankan      html  css  js  c++  java
  • leetcode438 找到字符串中所有字母异位词(Medium)

    题目来源:leetcode438 找到字符串中所有字母异位词

    题目描述:

    给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

    字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。

    说明:

    字母异位词指字母相同,但排列不同的字符串。
    不考虑答案输出的顺序。

    示例 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" 的字母异位词。

    解题思路:

    滑动窗口方法解题

    class Solution {
    public:
        vector<int> findAnagrams(string s, string p) {
           map<char,int> need,window;
           int i,j;
           for(i=0;i<p.size();i++){
               need[p[i]]++;
           }
           int left=0,right=0,valid=0;
           vector<int> ans;
           while(right<s.size()){
               char c=s[right];
               right++;
               if(need.count(c)){
                   window[c]++;
                   if(need[c]==window[c]) valid++;
               }
               while(right-left>=p.size()){
                   char k=s[left];
                   if(valid==need.size()){
                       ans.push_back(left);
                   }
                   left++;
                   if(need.count(k)){
                       if(need[k]==window[k]) valid--;
                       window[k]--;
     
                   }
               }
           }
           return ans;
        }
    };
    
  • 相关阅读:
    《我与我的父辈》影评
    如何进行时间规划?
    内向者相关
    修己 0815
    loj 3102
    StringSequences
    解方程
    problem B
    uoj424 count
    fft相关的复习
  • 原文地址:https://www.cnblogs.com/yjcoding/p/13444982.html
Copyright © 2011-2022 走看看