这个专栏 我将分享每日做的算法题的解题思路 秋招加油!
这是第五天 !!
014 字符串中的变位词
题目
AC代码
class Solution {
public boolean checkInclusion(String s1, String s2) {
if(s1.length() > s2.length()){
return false;
}
int[] cnt1 = new int[26];
int[] cnt2 = new int[26];
for(int i = 0;i<s1.length();i++){
cnt1[s1.charAt(i)-'a']++;
cnt2[s2.charAt(i)-'a']++;
}
if(Arrays.equals(cnt1,cnt2)){
return true;
}
for(int i = s1.length();i<s2.length();i++){
cnt2[s2.charAt(i)-'a']++;
cnt2[s2.charAt(i-s1.length())-'a']--;
if(Arrays.equals(cnt1,cnt2)){
return true;
}
}
return false;
}
}
第一个字符串的排列之一是第二个字符串的 子串 。所以只要统计区间个数即可,长度是固定的,所以可以使用 滑动窗口 。
015 字符串中的所有变位词
题目
AC代码
class Solution {
public List<Integer> findAnagrams(String s, String p) {
if (s.length() < p.length()) {
return new ArrayList<>();
}
List<Integer> list = new ArrayList<>();
int[] cnt1 = new int[26];
int[] cnt2 = new int[26];
for (int i = 0; i < p.length(); i++) {
cnt1[p.charAt(i)-'a']++;
cnt2[s.charAt(i)-'a']++;
}
if(Arrays.equals(cnt1,cnt2)){
list.add(0);
}
for(int i = p.length();i<s.length();i++){
cnt2[s.charAt(i)-'a']++;
cnt2[s.charAt(i-p.length())-'a']--;
if(Arrays.equals(cnt1,cnt2)){
list.add(i-p.length()+1);
}
}
return list;
}
}
这道是上一道的进阶,需要用list 记录索引值,但思路是一样的,也是用滑动窗口解决。
016 不含重复字符的最长子字符串
题目
AC代码
class Solution {
public int lengthOfLongestSubstring(String s) {
int result = 0;
int left = 0, right = 0;
Set<Character> set = new HashSet<>();
while(right < s.length()){
while(set.contains(s.charAt(right))){
set.remove(s.charAt(left));
left++;
}
set.add(s.charAt(right));
result = Math.max(result,right-left+1);
right++;
}
return result;
}
}
这道题可以使用双重循环解决,但是更好的方法就是滑动窗口。
很基础的滑动窗口解决的问题,在没有重复的时候不断添加,重复时,需要不断的去除左侧的字符,直至没有重复。
请再悄悄加点油,无论如何都想听你说:我终于成为不负众望的人了。