力扣中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;
    }

 

posted @ 2023-03-02 16:24  Ssshiny  阅读(14)  评论(0)    收藏  举报