lintcode(647)Substring Anagrams

来源:互联网 发布:暴雪彩票源码 编辑:程序博客网 时间:2024/05/18 01:05

描述:

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 40,000.

The order of output does not matter.

样例:

Given s = "cbaebabacd" p = "abc"

return [0, 6]

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".

思路:

首先遍历字符串s,截取以p中字符起始且与p等长的字符串,然后进入search进行判断,截取字符串是否与p包含相同的字符。

public class Solution {    /**     * @param s a string     * @param p a non-empty string     * @return a list of index     */    public List<Integer> findAnagrams(String s, String p) {        // Write your code here        List<Integer> result = new ArrayList<Integer>();        if(s == null || s.length() == 0){            return result;        }        for(int i = 0;i <= s.length() - p.length();i++){            if(p.indexOf(s.charAt(i)) >= 0){                String temp = s.substring(i , i+p.length());                search(temp , p , i , result);            }        }        return result;    }    public void search(String test , String p , int index , List<Integer> result){        int[] record = new int[26];        for(int i = 0;i<26;i++){            record[i] = 0;        }        for(int i = 0;i<test.length();i++){            record[test.charAt(i) - 'a']++;        }        for(int i = 0;i<p.length();i++){            if(record[p.charAt(i) - 'a'] < 1){                return;            }else{                record[p.charAt(i) - 'a']--;            }        }        for(int i = 0;i<26;i++){            if(record[i] != 0){                return;            }        }        result.add(index);    }}


0 0
原创粉丝点击