Anagrams
來源:程序員人生 發布時間:2015-01-20 08:25:25 閱讀次數:3018次
本文是在學習中的總結,歡迎轉載但請注明出處:http://blog.csdn.net/pistolove/article/details/42744709
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
思路:
(1)如果不知道anagrams的意思,很容易將題意理解錯了。最開始我理解的意思是求給定字符串數組的全排列有多少種。OJ幾次都錯了,后來被迫查了下anagrams的意思才知道,anagrams:由顛倒字母順序而構成的字[短語]。看來英語還是要學好啊。該題意為給定1個字符串數組,求得該數組中所有由相同字符組成的字符串序列。例如:給定字符串數組["abc","acb","cab","xyz","fg"],則結果為["abc","acb","cab"]。
(2)本文主要應用Map來存儲,其中Key為經過排序后的字符串(通過對字符串進行排序,能夠將順序打亂的字符串變得相同),value為打亂順序的1系列字符串。上例中key為"abc",value為["abc","acb","cab"]。然后通過判斷Map中value對應List中元素個數是不是大于1,如果大于1,說明有多個由相同字符組成但是順序被打亂的字符串。
(3)詳見下方代碼。希望對你有所幫助。(PS:其中Arrays.sort()方法是對給定的數組進行排序)
算法代碼實現以下:
/**
*
* @author liqq
*/
public static List<String> anagrams(String[] strs) {
if (strs == null || strs.length < 2)
return new ArrayList<String>();
Map<String, List<String>> maps = new HashMap<String, List<String>>();
for (String str : strs) {
char[] arr = str.toCharArray();
Arrays.sort(arr);
String key = new String(arr);
if (!maps.containsKey(key)) {
maps.put(key, new ArrayList<String>());
}
List<String> list = maps.get(key);
list.add(new String(str));
}
List<String> result = new ArrayList<String>();
for (Iterator<String> iterator = maps.keySet().iterator(); iterator
.hasNext();) {
String key = iterator.next();
if (maps.get(key).size() > 1) {
result.addAll(maps.get(key));
}
}
return result;
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈