lc_top_0922
lc3 无重复字符的最长子串
滑动窗口 维护不重复的集合,指针向右平移
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> set = new HashSet<>();
int n = s.length();
int rk = -1, ans = 0;
for (int i = 0; i< n; i++) {
if (i != 0) {
set.remove(s.charAt(i-1));
}
while(rk+1<n && !set.contains(s.charAt(rk+1))) {
set.add(s.charAt(rk+1));
rk++;
}
ans = Math.max(ans,rk-i+1);
}
return ans;
}
}
class Solution {
public int lengthOfLongestSubstring(String s) {
if (s.length() == 0) {
return 0;
}
HashMap<Character, Integer> map = new HashMap<>();
int max = 0;
int left = 0;
for (int i = 0; i < s.length(); i++) {
if (map.containsKey(s.charAt(i))) {
left = Math.max(left, map.get(s.charAt(i))+1);
}
map.put(s.charAt(i), i);
max = Math.max(max,i - left + 1);
}
return max;
}
}
两种解法,思路类似。
lc438 找到字符串中所有字母异位词
public List<Integer> findAnagrams(String s, String p) {
int sLen = s.length(), pLen = p.length();
List<Integer> ans = new ArrayList<>();
if (sLen < pLen) {
return ans;
}
int[] sCount = new int[26];
int[] pCount = new int[26];
for (int i = 0; i < pLen; i++) {
++sCount[s.charAt(i) - 'a'];
++pCount[p.charAt(i) - 'a'];
}
if (Arrays.equals(sCount, pCount)) {
ans.add(0);
}
for (int i = 0; i < sLen - pLen; i++) {
--sCount[s.charAt(i) - 'a'];
++sCount[s.charAt(i + pLen) - 'a'];
if (Arrays.equals(sCount, pCount)) {
ans.add(i + 1);
}
}
return ans;
}
//todo 滑动窗口
3. 无重复字符的最长子串
-
串联所有单词的子串
-
最小覆盖子串
-
至多包含两个不同字符的最长子串
-
长度最小的子数组
-
滑动窗口最大值
-
字符串的排列
-
最小区间
-
最小窗口子序列

浙公网安备 33010602011771号