-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path438.找到字符串中所有字母异位词.java
84 lines (67 loc) · 2.43 KB
/
438.找到字符串中所有字母异位词.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
* @lc app=leetcode.cn id=438 lang=java
*
* [438] 找到字符串中所有字母异位词
*/
// @lc code=start
class Solution {
public List<Integer> findAnagrams(String s, String p) {
// mine
// a b c a b c a b c a b c ...
// List<Integer> ret = new ArrayList<Integer>();
// if (p.length() > s.length()) return ret;
// int len = p.length();
// Map<Character, Integer> target = new HashMap<Character, Integer>();
// for (int i = 0 ; i < len ; i++) {
// target.put(p.charAt(i), target.getOrDefault(p.charAt(i), 0) + 1);
// }
// Map<Character, Integer> words = new HashMap<Character, Integer>();
// for (int i = 0 ; i < len ; i++) {
// words.put(s.charAt(i), words.getOrDefault(s.charAt(i), 0) + 1);
// }
// int start = 0;
// if (sameWords(words, target))
// ret.add(start);
// for (int end = len ; end < s.length() ; end++) {
// char c = s.charAt(end);
// words.put(c, words.getOrDefault(c, 0) + 1);
// char c1 = s.charAt(start);
// words.put(c1, words.getOrDefault(c1, 0) - 1);
// if (sameWords(words, target))
// ret.add(start + 1);
// start++;
// }
// return ret;
// solution from Nich White
List<Integer> result = new ArrayList<Integer>();
if (s == null || s.length() == 0) return result;
int[] charCount = new int[26];
for (char c : p.toCharArray()) {
charCount[c - 'a']++;
}
int left = 0;
int right = 0;
int count = p.length();
while (right < s.length()) {
// modify charCount directly
if (charCount[s.charAt(right++) - 'a']-- >= 1) {
count --;
}
if (count == 0) result.add(left);
if (right - left == p.length() && charCount[s.charAt(left++) - 'a']++ >= 0) {
count ++;
}
}
return result;
}
// 计算两个序列中有相同的单词
// private boolean sameWords(Map<Character, Integer> words, Map<Character, Integer> target) {
// for (char c : target.keySet()) {
// if (target.get(c).intValue() != words.getOrDefault(c, -1).intValue()) {
// return false;
// }
// }
// return true;
// }
}
// @lc code=end