Leetcode 438. Find All Anagrams in a String 找变位子串 解题报告

来源:互联网 发布:linux下jdk怎么卸载 编辑:程序博客网 时间:2024/06/06 02:16

1 解题报告

这道题,其实也就是要求从S中找到一个子串,这个子串变化后可以得到P(其实就是这个子串的26字母的分布和P一样)

所以自然而然的,我使用了最naïve的方式,就是直接滑动窗口(长度为P的大小),检查S的每一个子串的分布情况和P是否一样就可以了。

当然还可以优化检查的流程,但是既然AC了,我就不优化了~~~等不能通过那天再说

2 原题

Given a string s and a non-empty string p, find all the start indices of p's anagrams in s.Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.The order of output does not matter.Example 1: Input:s: "cbaebabacd" p: "abc"Output:[0, 6]Explanation:The substring with start index = 0 is "cba", which is an anagram of "abc".The substring with start index = 6 is "bac", which is an anagram of "abc".Example 2: Input:s: "abab" p: "ab"Output:[0, 1, 2]Explanation:The substring with start index = 0 is "ab", which is an anagram of "ab".The substring with start index = 1 is "ba", which is an anagram of "ab".The substring with start index = 2 is "ab", which is an anagram of "ab".

3 AC解

public class Solution {    private boolean check(int counter[],int tmp[]){        for(int i=0;i<26;i++) if (counter[i] != tmp[i]) return false;        return true;    }    /**     * 滑动窗口+每滑动一次就检查一次     * */    public List<Integer> findAnagrams(String s, String p) {        List<Integer> res = new ArrayList<Integer>();        if(s.length() < p.length()) return res;        char S[] = s.toCharArray();        char P[] = p.toCharArray();        int counter[] = new int[26];        int tmp[] = new int[26];        for(char c:P) counter[c-'a']++;        for(int i=0;i<P.length;i++) tmp[S[i]-'a']++;        if(check(counter,tmp)) res.add(0);        for(int i=P.length;i<S.length;i++){            tmp[S[i-P.length]-'a']--;            tmp[S[i]-'a']++;            if(check(counter,tmp)) res.add(i-P.length+1);        }        return res;    }}
0 0
原创粉丝点击