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".
    题目含义:给出一个字符串s和一个非空的字符串p,找到p的重组字符串在s中出现的开始位置

     1     public List<Integer> findAnagrams(String s, String p) {
     2 //        http://blog.csdn.net/chenwuji91/article/details/52981530
     3         List<Integer> result = new ArrayList<>();
     4         if (s == null || s.length() == 0 || p == null || p.length() == 0)
     5             return result;
     6         int[] hash = new int[256];
     7         char[] pp = p.toCharArray();
     8         for (char i : pp) {
     9             hash[i]++;
    10         }
    11         int left = 0, right = 0, count = p.length();
    12         while (right < s.length()) {
    13             if (hash[s.charAt(right++)]-- > 0)  //窗口右移;相应的hash值减小;如果这个位置的Hash值是正的,表示p字符串也包含这个,所以count做减法
    14                 count--;
    15             if (count == 0)
    16                 result.add(left);//count指示器,为0表示和p对应的hash值完全一致
    17             if (right - left == p.length() && hash[s.charAt(left++)]++ >= 0)
    18                 //如果当窗口大小和需要比较的字符串大小一致的时候,将窗口左边的指针向右边移动,移动的同时左边的字符计数因为在第一个if的地方hash值减小过,所以需要执行对应恢复操作,即:hash值增加,count计数值增加。
    19                 count++;
    20         }
    21         return result;        
    22     }

    这个代码长度不长,但是里面用到了很多知识点。第一个就是定义的hash数组长度是256,因为ascii码的长度是256位的,所以每一位的索引表示一个字符的计数值。另外就是在窗口的部分,分别用两个指针表示窗口的左边界和右边界。还有用count作为一个计数值,它的含义是窗口里面的字符串和p字符串的相差的字符个数。

    在窗口右移的过程中,如果这个位置上面的hash值是大于0的,那么,说明我当前这个位置的字符增加之后可以使得窗口和p字符串的相异度减小一个;然后判断如果count为0,即相异距离为0的时候,记录下左边界的位置,并加入到结果集合里面。接着就是移动左边界的指针,首先需要判断窗口长度等于p字符串的长度的时候才开始移动边界。移动做边界的时候,同样如果这个位置的hash值是非负的,才将count进行加一,包括在上面,如果加入了一个字符,使得hash值对应项是负值,则count值不会变化。

    最终,当右边界移动完成之后,则返回所有的满足条件时窗口左索引的集合。

  • 相关阅读:
    node连接mysql数据库
    mysql重置密码
    CSS vertical-align 属性
    JS中常用的字符串方法
    JS中的常用数组方法
    获取下拉菜单中具有SELECTED属性元素的序号和值的方法
    基本的正则表达式符号
    让多个文本输入框左侧对齐方法
    CSS选择器权重对比
    让内联元素支持宽高的几个设置
  • 原文地址:https://www.cnblogs.com/wzj4858/p/7718842.html
Copyright © 2011-2022 走看看