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".<Solution>
這題是 242. Valid Anagram 的進階題
解題想法如下
- 一樣使用 hash map 來當作查表
- 利用兩個指標,來做一個 window 的概念,歷遍 s
- 當 p 裡面的字元都用光的時候,檢查是否符合條件,並且更新狀態
這類的題目有一個樣版,可參考這篇文章
code 如下
Java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
public List<Integer> findAnagrams(String s, String p) { | |
//>> initialize | |
List<Integer> ans = new LinkedList<>(); | |
if(p.length() > s.length()) { | |
return ans; | |
} | |
//>> hash | |
int[] map = new int[26]; | |
for(final char c : p.toCharArray()) { | |
map[c-'a']++; | |
} | |
//>> maintain a counter | |
final int targetLen = p.length(); | |
int count = targetLen; | |
//>> loop from the begining of the string | |
int start = 0, end = 0; | |
final int inputLen = s.length(); | |
char c; | |
while(end < inputLen) { | |
//>> check hash and modify the counter according to the requirement | |
c = s.charAt(end++); | |
if(map[c-'a']-- > 0) { | |
--count; | |
} | |
//>> counter condition | |
while(count == 0) { | |
//>> modify the counter if it is necessary | |
c = s.charAt(start); | |
if(++map[c-'a'] > 0) { | |
++count; | |
} | |
//>> check the answer according to the requirement | |
if(end-start == targetLen) { | |
ans.add(start); | |
} | |
//>> increase begin pointer to make it invalid/valid again | |
++start; | |
} | |
} | |
//>> return ans | |
return ans; | |
} | |
} |
沒有留言:
張貼留言