LeetCode Hot100(滑动窗口)
3. 无重复字符的最长子串
我们都知道,每一个字母都对应一个ascii码,那我们从前往后遍历,当出现重复字符的时候,左边的指针开始走,直到把重复的字符删除
class Solution {public int lengthOfLongestSubstring(String s) {char []arr=s.toCharArray();if(s==""){return 0;}int len=arr.length;int ans=0;int sum=0;int []brr=new int[200];int l=0;for(int i=0;i<len;i++){int f=arr[i];brr[f]++;sum++;while(brr[f]>=2){int k=arr[l];brr[k]--;sum--;l++;}if(sum>ans){ans=sum;}}return ans;}
}
438. 找到字符串中所有字母异位词
跟上一题实际上是一样的思路,但是我们需要注意一点,一个是当前的字符长度应当等于我们需要的字符长度,另外一方面就是每个字母的数量也应当相等就可以了
class Solution {public static List<Integer> findAnagrams(String s, String p) {List<Integer>res=new ArrayList<>();int []mark=new int[200];int []mark2=new int[200];char []arr=s.toCharArray();char []brr=p.toCharArray();int []crr=new int[200];int sum=p.length();for(int i=0;i<sum;i++){int f=brr[i];mark[f]++;}int sum2=0;int l=0;for(int i=0;i<arr.length;i++){int f=arr[i];if(mark[f]>0){mark2[f]++;sum2++;}else{for(int j='a';j<='z';j++){mark2[j]=0;}sum2=0;l=i;continue;}while(mark2[f]>mark[f]){int f2=arr[l];if(mark[f2]==0){l++;continue;}mark2[f2]--;l++;sum2--;}// System.out.println(i+"---"+sum+"---"+sum2);if(sum2==sum){int k=i-sum+1;res.add(k);}}return res;}
}