zoukankan      html  css  js  c++  java
  • [LC] 438. Find All Anagrams in a String

    Given a string s and a non-empty string p, find all the start indices of p's anagrams in s.

    Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.

    The order of output does not matter.

    Example 1:

    Input:
    s: "cbaebabacd" p: "abc"
    
    Output:
    [0, 6]
    
    Explanation:
    The substring with start index = 0 is "cba", which is an anagram of "abc".
    The substring with start index = 6 is "bac", which is an anagram of "abc".
    

    Example 2:

    Input:
    s: "abab" p: "ab"
    
    Output:
    [0, 1, 2]
    
    Explanation:
    The substring with start index = 0 is "ab", which is an anagram of "ab".
    The substring with start index = 1 is "ba", which is an anagram of "ab".
    The substring with start index = 2 is "ab", which is an anagram of "ab".

    Time: O(N)

    class Solution:
        def findAnagrams(self, s: str, p: str) -> List[int]:
            
            my_dict = {}
            res = []
            count = 0
            for char in p:
                freq = my_dict.get(char, 0)
                my_dict[char] = freq + 1
                
            for i in range(len(s)):
                char = s[i]
                if char in my_dict:
                    my_dict[char] -= 1
                    if my_dict[char] == 0:
                        count += 1
                
                if i >= len(p):
                    start = i - len(p)
                    start_char = s[start]
                    if start_char in my_dict:
                        my_dict[start_char] += 1
                        if my_dict[start_char] == 1:
                            count -= 1
                # check my_dict size instead of len(p)
                if count == len(my_dict):
                    res.append(i - len(p) + 1)
            return res
                    
                
    public class Solution {
      public List<Integer> allAnagrams(String sh, String lo) {
        // Write your solution here
        Map<Character, Integer> map = new HashMap<>();
        char[] charArr = sh.toCharArray();
        for (int i = 0; i < charArr.length; i++) {
          map.put(charArr[i], map.getOrDefault(charArr[i], 0) + 1);
        }
    
        List<Integer> res = new ArrayList<>();
        char[] lCharArr = lo.toCharArray();
        int count = 0;
        int start = 0;
        for (int i = 0; i < lCharArr.length; i++) {
          char cur = lCharArr[i];
          if (map.containsKey(cur)) {
            int num = map.get(cur);
            if (num == 1) {
              count += 1;
            }
            map.put(cur, num - 1);
          }
    
          if (i >= sh.length()) {
            start = i - sh.length();
            if (map.containsKey(lCharArr[start])) {
              int startNum = map.get(lCharArr[start]);
              if (startNum == 0) {
                count -= 1;
              }
              map.put(lCharArr[start], startNum + 1);
            }
          }
    
          if (count == map.size()) {
            res.add(i - sh.length() + 1);
          }
        }
        return res;
      }
    }
  • 相关阅读:
    17. Letter Combinations of a Phone Number
    77. Combinations
    90. Subsets II
    78. Subsets
    275. H-Index II
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    树状数组区间查询和单点更新
    树状数组区间查询和单点更新
    最小生成树 kuangbin专题最后一个题
  • 原文地址:https://www.cnblogs.com/xuanlu/p/11653258.html
Copyright © 2011-2022 走看看