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; } }