https://leetcode-cn.com/problems/positions-of-large-groups/
用双指针遍历, i
为始指针, j
为尾指针,外层为for循环,用于更新始指针 i
的值,内层为while循环(连续的计数通常使用while循环),用于更新尾指针 j
的值,不断遍历后更新尾指针的值,如果 j-i>=3
,就可以添加到list中了,然后在更新始指针i即可。
public List<List<Integer>> largeGroupPositions(String S) {
List<List<Integer>> lists = new ArrayList<>();
for (int i = 0; i < S.length(); ) {
int j = i;
while (j < S.length() && S.charAt(j) == S.charAt(i)) {
j++;
}
if (j - i >= 3) {
List<Integer> list = new ArrayList<>();
list.add(i);
list.add(j - 1);
lists.add(list);
}
i = j;
}
return lists;
}
https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/
根据题意我们第一想法肯定是把s遍历一遍,然后找出其中所有的和p的长度相同的子串,判断是不是p的字母异位词,所以重点就在如何判断是不是p的字母异位词了。
这里先给出几种想法:
上述三种方式都进行试验过,只有3没有超时,这里放出代码
public List<Integer> findAnagrams(String s, String p) {
List<Integer> list = new ArrayList<>();
char[] ss = s.toCharArray();
char[] ps = p.toCharArray();
int[] pmap = new int[26];
for (char c : ps) {
pmap[c - 'a']++;
}
for (int i = 0; i < ss.length - ps.length + 1; i++) {
char[] temp = new char[ps.length];
int num = 0;
for (int j = i; j < i + ps.length; j++) {
temp[num++] = ss[j];
}
int[] smap = new int[26];
for (char c : temp) {
smap[c - 'a']++;
}
boolean equal = true;
for (int j = 0; j < 26; j++) {
if (pmap[j] != smap[j]) {
equal = false;
break;
}
}
if (equal) {
list.add(i);
}
}
return list;
}