題目
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
Anagrams
Anagrams(回文構詞法),Anagrams是由顛倒字母順序組成的單詞,比如“cat”顛倒字母順序是“tca”
Anagrams的特點:單詞裡的字母的種類和數目沒有改變,只是改變了字母的排列順序
因此,我們只要將單詞先按照字母排序,然後就可以判斷它們是否為anagrams
思路
利用Java的HashMap類,記錄排序後的字符串和字符串首次出現的下標,步驟如下:
從strs第一個元素開始遍歷,對每一個元素獲取其按字典序排序後的結果String tmp判斷hashmap裡是否存在tmp若不存在,將tmp和該字符串首次出現的下標loc存入hashmap中若存在,從hashmap裡取出該字符串首次出現的下標loc,將str[loc]和當前字符串str[i]存入結果集中,並置hashmap關於str[loc]的下標為-1,防止再次存入
AC代碼
public class Solution {
public static ArrayList anagrams(String[] strs) {
ArrayList res = new ArrayList();
if (strs == null || strs.length == 0) {
return res;
}
HashMap hashmap = new HashMap();
for (int i = 0; i < strs.length; i ++) {
String tmp = sortSingleString(strs[i]);
if (! hashmap.containsKey(tmp)) {
hashmap.put(tmp, i);
} else {
int loc = hashmap.get(tmp);
if (loc != -1) {
res.add(strs[loc]);
}
res.add(strs[i]);
hashmap.put(tmp, -1);
}
}
return res;
}
public static String sortSingleString(String str) {
char[] array = str.toCharArray();
Arrays.sort(array);
String res = new String(array);
return res;
}
}