題目地址:
https://www.lintcode.com/problem/find-all-anagrams-in-a-string/description
給定兩個字符串和,如果的某個排列能成爲的子串,則記錄下這個子串的第一個字母的下標。返回所有這樣的下標。題目保證字符串只含小寫英文字母。
思路和https://blog.csdn.net/qq_46105170/article/details/106140361類似,不同的地方只在於本題需要返回所有位置,所以每個位置都要判斷一下是否符合。代碼如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
/**
* @param s: a string
* @param p: a string
* @return: a list of index
*/
public List<Integer> findAnagrams(String s, String p) {
// write your code here
List<Integer> res = new ArrayList<>();
if (s.length() < p.length()) {
return res;
}
int[] pletters = new int[26], sletters = new int[26];
for (int i = 0; i < p.length(); i++) {
pletters[p.charAt(i) - 'a']++;
sletters[s.charAt(i) - 'a']++;
}
if (Arrays.equals(pletters, sletters)) {
res.add(0);
}
for (int i = p.length(); i < s.length(); i++) {
sletters[s.charAt(i - p.length()) - 'a']--;
sletters[s.charAt(i) - 'a']++;
if (Arrays.equals(pletters, sletters)) {
res.add(i - p.length() + 1);
}
}
return res;
}
}
時間複雜度,是的長度。