这是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