567. Permutation in String

这是weekly contest30的第三题。
这题拿到之后我直接想到用DFS把Permutations都求出来然后判断是不是substring。我自己试着没问题但是leetcode TLE了。
如下,我感觉dfs部分写得还是不错的。。。hhh,带返回参数,想得很清楚。还有那个s + s1.charAt(i),一定要写在dfs的参数里面哦,不然不会恢复现场的。

DFS做法(会超时)

    String sss;
    public boolean checkInclusion(String s1, String s2) {
        if (s1 == null || s1.length() == 0) return true;
        if (s2 == null) return false;
        sss = s2;
        boolean[] used = new boolean[s1.length()];
        String s = "";
        return dfs(s, s1, used);
    }

    private boolean dfs(String s, String s1, boolean[] used) {
        if (s.length() == s1.length()) {
            if (isSubstring(s)) return true;
            else return false;
        }
        for (int i = 0; i < s1.length(); i++) {
            if (!used[i]) {
                used[i] = true;
                if (dfs(s + s1.charAt(i), s1, used)) return true;
                used[i] = false;
            }
        }
        return false;
    }

    private boolean isSubstring(String s1) {
        for (int i = 0; i < sss.length() - s1.length() + 1; i++) {
            if (sss.substring(i, i + s1.length()).equals(s1)) return true;
        }
        return false;
    }

SLIDING WINDOW(O(N))

大家一致使用了滑动窗口(wack也用了。bitmap)。

    public boolean checkInclusion(String s1, String s2) {
        int n1 = s1.length(), n2 = s2.length();
        if (n1 > n2) return false;
        int[] map1 = new int[26];
        int[] map2 = new int[26];
        for (int i = 0; i < n1; i++) {
            map1[s1.charAt(i) - 'a']++;
        }
        for (int j = 0; j < n2; j++) {
            map2[s2.charAt(j) - 'a']++;
            if (j >= n1) {
                //定位到从窗口出去的那个数,减去一次occurence
                map2[s2.charAt(j - n1) - 'a']--;
            }
            if (Arrays.equals(map1, map2)) return true;
        }
        return false;
    }

ref:
https://discuss.leetcode.com/topic/87873/simple-clear-java-solution

你可能感兴趣的:(567. Permutation in String)