zoukankan      html  css  js  c++  java
  • leetcode-438.找到字符串中所有字母异位词


    本题是leetcode,地址:438. 找到字符串中所有字母异位词

    题目

    给定一个字符串 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" 的字母异位词。

    分析

    对于类似子串、子数组题目,我们几乎都可以采用滑动窗口的思路来解决;

    需要注意的是:输入的 s1 是可以包含重复字符,所以我们统计字符出现的个数;

    1. 统计我们需要的字符:Map<Character,Integer> need = new HashMap<>();
    2. 定义我们的滑动窗口:Map<Character,Integer> window = new HashMap<>();
    3. 准备开始遍历s2,定义左右指针,left、right;
    4. 使用valid记录遍历过程中的有效值是否跟need的大小size一致,如果一致,返回true
    5. right指针右移时,统计valid有效值;left右移时,减少valid有效值;
    6. end

    code

        public List<Integer> findAnagrams(String s, String p) {
            List<Integer>  rs = new ArrayList<>();
            Map<Character,Integer> need = new HashMap<>(8);
            for (Character c : p.toCharArray()) {
                need.put(c,need.getOrDefault(c,0) + 1);
            }
            
            Map<Character,Integer> window = new HashMap<>(8);
    
            int left = 0, right = 0;
            int valid = 0;
            while(right < s.length()) {
                char c = s.charAt(right);
                right ++;
                if(need.containsKey(c)) {
                    window.put(c,window.getOrDefault(c,0) + 1);
                    if(window.get(c).equals(need.get(c))) {
                        valid ++;
                    }
                }
    
                if(valid == need.size()) {
                    rs.add(left);
                }
    
                while(right - left >= p.length()) {
                    char d = s.charAt(left);
                    left ++;
                    if(need.containsKey(d)) {
                        if(window.get(d).equals(need.get(d))) {
                            valid --;
                        }
                        window.put(d,window.getOrDefault(d,0) - 1);
                    }
                }
            }
            return rs;
        }
    

    你的鼓励也是我创作的动力

    打赏地址

  • 相关阅读:
    php连接mysql数据库基础
    控制操作
    巨慢IE9的加速
    推广邮件客户端(二):完美的IMAP客户端
    XPath 和 LINQ to XML 的比较
    推广邮件客户端(三):常用IMAP客户端介绍
    关于Git工具与GitHub
    Android开源项目(非组件)
    windows下使用Git获取Android源码
    Eclipse导入项目:No projects are found to import
  • 原文地址:https://www.cnblogs.com/yangsanchao/p/13383138.html
Copyright © 2011-2022 走看看