zoukankan      html  css  js  c++  java
  • 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".

    用sliding window模板,保存结果的判断条件是fast - slow == p.length()

    time: O(n), space: O(m)  -- n: length of s, m: length of p

    class Solution {    
        public List<Integer> findAnagrams(String s, String p) {
            List<Integer> res = new ArrayList<>();
            if(s.length() == 0 || s.length() < p.length()) {
                return res;
            }
            
            Map<Character, Integer> map = new HashMap<>();
            for(char c : p.toCharArray()){
                map.put(c, map.getOrDefault(c, 0) + 1);
            }
            
            int counter = map.size(), slow = 0, fast = 0;
            
            while(fast < s.length()) {
                char c = s.charAt(fast);
                if(map.containsKey(c)) {
                    map.put(c, map.get(c) - 1);
                    if(map.get(c) == 0) {
                        counter--;
                    }
                }
                fast++;
                
                while(counter == 0) {
                    char tempc = s.charAt(slow);
                    if(map.containsKey(tempc)) {
                        map.put(tempc, map.get(tempc) + 1);
                        if(map.get(tempc) > 0) {
                            counter++;
                        }
                    }
                    if(fast - slow == p.length()) {
                        res.add(slow);
                    }
                    slow++;
                }
            }
            return res;
        }
    }

    二刷:

    class Solution {
        public List<Integer> findAnagrams(String s, String p) {
            List<Integer> res = new ArrayList<>();
            Map<Character, Integer> map = new HashMap<>();
            for(char c : p.toCharArray()) {
                map.put(c, map.getOrDefault(c, 0) + 1);
            }
            
            int slow = 0, fast = 0, counter = map.size();
            while(fast < s.length()) {
                char c = s.charAt(fast);
                
                if(map.containsKey(c)) {
                    int cnt = map.get(c);
                    map.put(c, cnt - 1);
                    if(cnt == 1) {
                        counter--;
                    }
                }
                fast++;
                
                while(counter == 0) {
                    if(fast - slow == p.length()) {
                        res.add(slow);
                    }
                    char t = s.charAt(slow);
                    if(map.containsKey(t)) {
                        int cnt2 = map.get(t);
                        map.put(t, cnt2 + 1);
                        if(cnt2 == 0) {
                            counter++;
                        }
                    }
                    slow++;
                }
            }
            return res;
        }
    }
  • 相关阅读:
    计算中文或全角字符串的长度
    day25 python学习 继承,钻石继承 多态
    day25 python学习 继承,钻石继承
    day24 python学习 类 画元,命名空间作用域,组合,人狗大战升级
    第四周经典问题收集
    day23 python学习 类 人狗大战
    day20 python sys os time json pickl 正则
    python 常见的内置函数
    encode decode enumerate
    3.易错点和新要掌握的内容
  • 原文地址:https://www.cnblogs.com/fatttcat/p/10302104.html
Copyright © 2011-2022 走看看