目录
无重复字符的最长子串
关键是想到ASCII码128的char数组来记录元素,每次右指针重复且重复位置位于左右指针之间时将左指针指向重复位置。
java
public class 无重复字符的最长子串 {
class Solution {
public int lengthOfLongestSubstring(String s) {
int res = 0;
int[] index = new int[128];
Arrays.fill(index, -1);
char[] chars = s.toCharArray();
int l = 0;
for (int r = 0; r < chars.length; r++) {
if (index[chars[r]]>=l){
res = Math.max(res, r-l);
l = index[chars[r]]+1;
}
index[chars[r]] = r;
}
return Math.max(res, s.length()-l);
}
}
}
找到字符串中所有字母异位词
用队列 恢复现场,不过要注意元素已足够和元素不需要的情况在出队后要分别操作。
java
public class 找到字符串中所有字母异位词 {
class Solution {
public List<Integer> findAnagrams(String s, String p) {
ArrayList<Integer> res = new ArrayList<>();
int[] P = new int[26];
for (char c : p.toCharArray()) P[c - 'a']++;
int l = 0;
char[] chars = s.toCharArray();
ArrayDeque<Character> queue = new ArrayDeque<>();
for (int i = 0; i < chars.length; i++) {
// chars[i]在窗口中仍然不够
if (P[chars[i]-'a']>0){
queue.offerLast(chars[i]);
P[chars[i]-'a']--;
}
// chars[i]在窗口中已经足够了
else{
char first;
// 出队直到窗口出去一个和chars[i]相同的元素
while (!queue.isEmpty()) {
first = queue.pollFirst();
l++;
P[first - 'a']++;
if (first== chars[i]) break;
};
// 然后将当前元素放进去
if (P[chars[i]-'a']>0){
queue.offerLast(chars[i]);
P[chars[i]-'a']--;
}else{
l++;
}
}
if (queue.size()==p.length()) res.add(l);
}
return res;
}
}
}