力扣中438 找到字符串中所有字母异位词
算一遍过吧其实
//只不过最开始的前len2长度判断加在了第一个for里面 导致开头就相等的情况下会输出-1什么的
class Solution { public static List<Integer> findAnagrams(String s, String p) { List<Integer> res=new LinkedList<Integer>(); int len1=s.length(),len2=p.length(); if(len1<len2) { return res; } int[] count1=new int[26]; int[] count2=new int[26]; for(int i=0;i<len2;i++) { count1[s.charAt(i)-'a']++; count2[p.charAt(i)-'a']++; } if(Arrays.equals(count1, count2)) {//最开始这块加在了第一个for里面 导致开头就相等的情况下会输出-1什么的 res.add(0); } for(int i=len2;i<len1;i++) { count1[s.charAt(i)-'a']++; count1[s.charAt(i-len2)-'a']--; if(Arrays.equals(count1, count2)) { res.add(i+1-len2); } } return res; } }
//滑动窗口优化版本 优化根据diff 先添加进去算diff的个数 判相等
//再移动窗口看变化后的diff
//由于看了双指针 所以老混 双指针不限制长度 短的减长的加 大于零的位置就不断移除
//滑动窗口优化版本 优化根据diff 先添加进去算diff的个数 判相等 //再移动窗口看变化后的diff //由于看了双指针 所以老混 双指针不限制长度 短的减长的加 大于零的位置就不断移除 public static List<Integer> findAnagrams(String s, String p) { List<Integer> res=new LinkedList<Integer>(); int len1=s.length(),len2=p.length(); int diff=0,right=len2; if(len1<len2) { return res; } int[] count=new int[26]; for(int i=0;i<len2;i++) { count[s.charAt(i)-'a']++; count[p.charAt(i)-'a']--; } for(int i:count) { if(i!=0) { diff++; } } if(diff==0) { res.add(0); } while(right<len1) { // if(s.charAt(right)==s.charAt(right-len2)) { // continue;//如果加这句 需要right+1 加上判断刺客是不是被添加了 反而麻烦 // } if(count[s.charAt(right)-'a']==0) { diff++; } count[s.charAt(right)-'a']++; if(count[s.charAt(right)-'a']==0) { diff--; } if(count[s.charAt(right-len2)-'a']==0) { diff++; } count[s.charAt(right-len2)-'a']--; if(count[s.charAt(right-len2)-'a']==0) { diff--; } if(diff==0) { res.add(right+1-len2); } right++; } return res; }

浙公网安备 33010602011771号