首页 > 其他 > 详细

Leetcode 438. Find All Anagrams in s String

时间:2017-03-01 14:05:02      阅读:251      评论:0      收藏:0      [点我收藏+]

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 = cbaebabacd

p = abc

w = [cb]

w+a = [cba],如果counter之后等于counter(p), 输出头index。在remove 第一个字母c的时候,注意这是counter c的value是不是1。如果是1的话,直接remove。不是1的话,减1。

 1 from collections import Counter
 2 
 3 class Solution(object):
 4     def findAnagrams(self, s, p):
 5         """
 6         :type s: str
 7         :type p: str
 8         :rtype: List[int]
 9         """
10         size = len(p)
11         n    = len(s)
12         pCounter = Counter(p)
13         sCounter = Counter(s[:size-1])
14         
15         ans = []
16         
17         for i in range(size-1,n):
18             sCounter[s[i]] += 1
19             if sCounter == pCounter:
20                 ans.append(i-size+1)
21             if sCounter[s[i-size+1]] == 1:
22                 del sCounter[s[i-size+1]]
23             else:
24                 sCounter[s[i-size+1]] -= 1
25         return ans

 

Leetcode 438. Find All Anagrams in s String

原文:http://www.cnblogs.com/lettuan/p/6483654.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!