find All Anagram

题目地址:
http://www.1point3acres.com/bbs/thread-283632-1-1.html

题目:
find all anagram in a string , find all the indices of all the starting anagrams.
List<Integer>  findAllAnagram(String haystack, String needle){}。

解题思路:
这道题主要就是用一个长度为needle的size的list,然后用一个map<String, List<Integer>>来保存某个排好序的String,和所有开始的index。

代码:

public class FindAllAnagram {

    List<Integer> findAllAnagram(String haystack, String needle){
        List<Character> list = new ArrayList<>();
        Map<String, List<Integer>> map = new HashMap<>();
        int size = needle.length();
        for(int i = 0; i <= haystack.length() - 1; i++){
            if(list.size() < size){
                list.add(haystack.charAt(i));
            }
            if(list.size() == size){
                List<Character> temp = new ArrayList<>(list);
                Collections.sort(temp);
                String s = convert(temp);
                if(!map.containsKey(s)){
                    map.put(s, new ArrayList<>());
                }
                map.get(s).add(i - size + 1);
                list.remove(0);
            }
        }
        char[] chars = needle.toCharArray();
        Arrays.sort(chars);
        String str = String.valueOf(chars);
        for(String s : map.keySet()){
            if(s.equals(str)){
                return map.get(s);
            }
        }
        return null;
    }

    private String convert(List<Character> temp) {
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i <= temp.size() - 1; i++){
            sb.append(temp.get(i));
        }
        return sb.toString();
    }

    public static void main(String[] args){
        String haystack = "abcdbcab";
        String needle = "cba";
        FindAllAnagram findAllAnagram = new FindAllAnagram();
        List<Integer> rst = findAllAnagram.findAllAnagram(haystack, needle);
        System.out.println(rst);
    }

}


Comments

Popular Posts