我有这个问题的滑动窗口算法; Given a string s and a non-empty string p, find all the start indices of p's anagrams in s.
人们说这个算法的运行时间是o(len(s))
,如果我理解正确的话,我想确保它。
所以外部while是o(len(s))
(假设地图查找是o(1)),内部while循环也可以在最坏的情况下运行o(len(s))
。例如,如果S
为axyzzzzzzzbc
且P
为abc
,则内部while循环将开始指针移动到结尾,因此它将为o(len(s) + len(s))
所以它是o(2len(s))
但我们会不断变化,因此最终的运行时间为o(len(s))
。
如果这是正确的,请告诉我。
public List<Integer> findAnagrams(String s, String p) {
List<Integer> ret = new ArrayList<>();
Map<Character, Integer> map = new HashMap<>();
for (Character c : p.toCharArray()) {
map.put(c, map.get(c) == null ? 1 : map.get(c) + 1);
}
int b = 0, i = 0;
int c = map.size();
while (i < s.length()) {
if (map.containsKey(s.charAt(i))) {
int t = map.get(s.charAt(i)) - 1;
map.put(s.charAt(i), t);
if (t == 0) c--;
}
i++;
while (c == 0) {
if (map.containsKey(s.charAt(b))) {
int t = map.get(s.charAt(b)) + 1;
map.put(s.charAt(b), t);
if (t > 0) c++;
c++;
}
if (i - b == p.length()) {
ret.add(b);
}
b++;
}
}
return ret;
答案 0 :(得分:0)
是的,复杂性是线性的。
大多数字符都被处理两次 - 除了最后M=p.length-1
个字符。
所以O(N + N - M) = O(N)