滑动窗口时间复杂度

时间:2017-07-08 22:21:33

标签: algorithm time-complexity

我有这个问题的滑动窗口算法; 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))。例如,如果SaxyzzzzzzzbcPabc,则内部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;

1 个答案:

答案 0 :(得分:0)

是的,复杂性是线性的。 大多数字符都被处理两次 - 除了最后M=p.length-1个字符。

所以O(N + N - M) = O(N)