leetcode438:找到字符串中所有字母异位词-----滑动窗口实现

本文详细解析了LeetCode第438题“找到字符串中所有字母异位词”的算法实现,通过使用哈希表和滑动窗口技术,高效地在目标字符串中查找与模式串相匹配的所有异位词的位置。

                      leetcode438:找到字符串中所有字母异位词

文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Anagrams {
    /***
     * 438找到字符串中所有字母异位词
     */

       public static  List findAnagrams(String s1, String p1,List<Integer> result)
        {
            char []s;
            char []p;
            s=s1.toCharArray();//把字符串转变为字符数组,实现遍历字符串的每一个字符
            p=p1.toCharArray();
            if(s.length == 0||p.length == 0)
                return result;
            System.out.println(s.length);
            System.out.println(p.length);
            int [] vs= new int[26];//用数组来创建两个哈希表;
            int [] vp= new int[26];
            //主要的内容;
            for(char c:p)//遍历p字符串数组;结果存入到vp中;存入的是数字;
                vp[c-'a']++;
            System.out.println("vp.length::"+vp.length);
            for(int i=0;i<vp.length;i++){
                System.out.print(i+":"+vp[i]+"     ");
            }
            //主要的算法内容;
            for(int i = 0; i < s.length; i++)//遍历给定的要查找的字符串;
            {
                if(i>=p.length)//如果说此时的下标大于滑动窗口的长度;
                    vs[s[i-p.length]-'a']--;
                vs[s[i]-'a']++;//将当前的字符加入到滑动窗口中;

                if(Arrays.equals(vs,vp))//注意这里只比较数组的内容并不需要比较顺序;Java不支持直接vs==vp
                    result.add(i-p.length+1);
            }
            return result;
        }

    public static void main(String[] args) {
        String s1 = "abab";
        String p1 = "ab";
        List<Integer> result = new ArrayList<Integer>();
        findAnagrams(s1,p1,result);
//        System.out.println(1);
        //System.out.println(result.size());
        for(int i=0;i<result.size();i++){
            //System.out.println(1);
            System.out.println(result.get(i));
        }
    }



}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值