題目地址:
https://www.lintcode.com/problem/permutation-in-string/description
給定兩個字符串和,判斷將中的字符重排後能否成爲的子串。題目保證字符串只含英文小寫字母。
先判斷長度是否小於,如果是則直接返回false。然後將的各個字母出現的次數用一個整形數組記錄一下,接着開始遍歷長度和相等的子串,同時進行比較,一旦找到就返回true。代碼如下:
import java.util.Arrays;
public class Solution {
/**
* @param s1: a string
* @param s2: a string
* @return: if s2 contains the permutation of s1
*/
public boolean checkInclusion(String s1, String s2) {
// write your code here
if (s2.length() < s1.length()) {
return false;
}
int[] letters1 = new int[26], letters2 = new int[26];
for (int i = 0; i < s1.length(); i++) {
letters1[s1.charAt(i) - 'a']++;
letters2[s2.charAt(i) - 'a']++;
}
if (Arrays.equals(letters1, letters2)) {
return true;
}
for (int i = s1.length(); i < s2.length(); i++) {
// 添加新字母減掉出了窗口的字母
letters2[s2.charAt(i) - 'a']++;
letters2[s2.charAt(i - s1.length()) - 'a']--;
if (Arrays.equals(letters1, letters2)) {
return true;
}
}
return false;
}
}
時間複雜度,是的長度,由於數組長度是常數,所以比較兩個數組是否相等可以看成所耗時間是常數。空間。