forked from fishercoder1534/Leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFindAllAnagramsinaString.java
64 lines (55 loc) · 2.03 KB
/
FindAllAnagramsinaString.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package com.fishercoder.solutions;
import java.util.ArrayList;
import java.util.List;
public class FindAllAnagramsinaString {
/**O(m*n) solution, my original and most intuitive one, but kind of brute force.*/
public List<Integer> findAnagrams(String s, String p) {
List<Integer> result = new ArrayList();
for (int i = 0; i <= s.length()-p.length(); i++){
if (isAnagram(s.substring(i, i+p.length()), p)) result.add(i);
}
return result;
}
private boolean isAnagram(String s, String p){
int[] c = new int[26];
for (int i = 0; i < s.length(); i++){
c[s.charAt(i) - 'a']++;
c[p.charAt(i) - 'a']--;
}
for (int i : c){
if(i != 0) return false;
}
return true;
}
static class SlidingWindowSolution {
/**O(n) solution inspired by this post: https://discuss.leetcode.com/topic/64434/shortest-concise-java-o-n-sliding-window-solution*/
public List<Integer> findAnagrams(String s, String p) {
List<Integer> result = new ArrayList();
int[] hash = new int[26];
for (char c : p.toCharArray()){
hash[c - 'a']++;
}
int start = 0, end = 0, count = p.length();
while (end < s.length()){
if(hash[s.charAt(end) - 'a'] > 0){
count--;
}
hash[s.charAt(end) - 'a']--;
end++;
if(count == 0) result.add(start);
if((end - start) == p.length()){
if(hash[s.charAt(start) - 'a'] >= 0) count++;
hash[s.charAt(start) - 'a']++;
start++;
}
}
return result;
}
}
public static void main(String...args){
SlidingWindowSolution test = new SlidingWindowSolution();
String s = "cbaebabacd";
String p = "abc";
test.findAnagrams(s, p);
}
}