49. Group Anagrams

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        HashMap<String, List<String>> map = new HashMap<>();
        if(strs == null || strs.length == 0){
            return new ArrayList<List<String>>();
        }

        for(String str : strs){
            int[] arr = new int[26];
            for(int i = 0; i < str.length(); i++){
                arr[str.charAt(i) - 'a']++;
            }
            String key = Arrays.toString(arr);
            List<String> tempList = map.getOrDefault(key, new ArrayList<String>());
            tempList.add(str);
            map.put(key, tempList);
        }
        return new ArrayList<List<String>>(map.values());
    }
}

87. Scramble String

递归

简单的说,就是s1和s2是 scramble 的话,那么必然存在一个在 s1 上的长度 l1,将 s1 分成 s11 和 s12 两段,同样有 s21 和 s22,那么要么 s11 和 s21 是 scramble 的并且 s12 和 s22 是 scramble 的;要么 s11 和 s22 是 scramble 的并且 s12 和 s21 是 scramble 的。

class Solution {
    public boolean isScramble(String s1, String s2) {
        if(s1.equals(s2)) return true;

        int[] letters = new int[26];
        for(int i = 0; i < s1.length(); i++){
            letters[s1.charAt(i) - 'a']++;
            letters[s2.charAt(i) - 'a']--;
        }

        for(int i = 0; i < 26; i++){
            if(letters[i] != 0) return false;
        }

        for(int i = 1; i < s1.length(); i++){
            if(isScramble(s1.substring(0, i), s2.substring(0, i))
               && isScramble(s1.substring(i), s2.substring(i))) return true;
            if(isScramble(s1.substring(0, i), s2.substring(s2.length() - i))
              && isScramble(s1.substring(i), s2.substring(0, s2.length() - i))) return true;
        }
        return false;
    }
}
01-01 08:50