438 .Find All Anagrams in a String

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,找出s中出现p的起始位置

  • 思路:此类题通用方法 https://discuss.leetcode.com/topic/68976/sliding-window-algorithm-template-to-solve-all-the-leetcode-substring-search-problem/2

  • 代码

    package HashTable;
    
    import java.util.*;
    
    /**
    * @author OovEver
    * 2018/1/11 14:32
    */
    public class LeetCode438 {
      public static List<Integer> findAnagrams(String s, String t) {
              List<Integer> result = new LinkedList<>();
              if(t.length()> s.length()) return result;
              Map<Character, Integer> map = new HashMap<>();
              for(char c : t.toCharArray()){
                  map.put(c, map.getOrDefault(c, 0) + 1);
              }
              int counter = map.size();
    
              int begin = 0, end = 0;
              int head = 0;
              int len = Integer.MAX_VALUE;
    
    
              while(end < s.length()){
                  char c = s.charAt(end);
                  if( map.containsKey(c) ){
                      map.put(c, map.get(c)-1);
                      if(map.get(c) == 0) counter--;
                  }
                  end++;
    
                  while(counter == 0){
                      char tempc = s.charAt(begin);
                      if(map.containsKey(tempc)){
                          map.put(tempc, map.get(tempc) + 1);
                          if(map.get(tempc) > 0){
                              counter++;
                          }
                      }
                      if(end-begin == t.length()){
                          result.add(begin);
                      }
                      begin++;
                  }
    
              }
              return result;
          }
    
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值