LeetCode438(滑动窗口)

题目:

给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。

说明:

字母异位词指字母相同,但排列不同的字符串。
不考虑答案输出的顺序。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答:

这题是滑动窗口的典型题。

首先先创建一个哈希表(这里用数组代替)来记录字符串 p 中包含的字符及其数目。

紧接着创建头指针和尾指针来遍历字符串 s 。

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> list = new ArrayList<>();
        if (s == null || s.length() == 0 || p == null || p.length() == 0) 
            return list;
        int[] hash = new int[256]; //字符哈希表
        //记录在 t 中出现的字符及其次数
        for (char c : p.toCharArray()) {
            hash[c]++;
        }
        int left=0,right=0,cnt=p.length();
        while(right<s.length()){
            //若是遍历到的字符在t内,应该大于1
            if(hash[s.charAt(right++)]-- >=1) cnt--;
            if(cnt==0)
                list.add(left);
            //移动头指针,只有当hash的值大于0才使cnt++,代表这个原来就在t内。
            //加1是因为头指针前移了,需要还原cnt的值
            if(right-left==p.length()&&hash[s.charAt(left++)]++ >= 0) cnt++;
        }
        return list;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容