leetcode hot 12

解题思路:还是滑动窗口题,主要是如何记录p内所有字符的情况,一种方法就是用2个长26的数组,用'str'-a对数组加值,先把p的那个数组确定,然后用end遍历S,每进一个对应的数组的值就加1,如果长度超过p就把start的对应的值减1,然后start++,如果最后长度等于p,那就比较两个数组,相同的话就把start的值加到结果列表中,最后返回。我的想法是当窗口达到后,用sort排序,如果和排序后的p相同放进去,时间更长。

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> list = new ArrayList<>();
        int[] origin = new int[26];
        int[] now = new int[26];
        for(char str:p.toCharArray()) origin[str-'a']++;
        int start = 0;
        for(int end=0;end<s.length();++end){
            now[s.charAt(end)-'a']++;
            if(end-start+1>p.length()){
                now[s.charAt(start)-'a']--;
                start++;
            } 
            if(end-start+1==p.length()){
                if(Arrays.equals(origin,now)) list.add(start); 
            }
        }
        return list;
    }
}
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> res = new ArrayList<>();        
        int start = 0;
        char[] strs = s.toCharArray();
        char[] q = p.toCharArray();
        Arrays.sort(q);
        for(int end=0;end<s.length();++end){
            if(p.indexOf(s.charAt(end))==-1){
                start = end+1;
                continue;
            }
            if(end-start+1>p.length())
                start+=1;
            if(end-start+1<p.length()) continue;
            char[] substrs = Arrays.copyOfRange(strs,start,end+1);
            Arrays.sort(substrs);
            if(Arrays.equals(substrs, q)){
                res.add(start);
            }
        }
        return res;
    }
}
posted @   kukudev  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示