Leetcode--49. 字母异味词分组
給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。
示例:
輸入: ["eat", "tea", "tan", "ate", "nat", "bat"],
輸出:
[
? ["ate","eat","tea"],
? ["nat","tan"],
? ["bat"]
]
說明:
所有輸入均為小寫字母。
不考慮答案輸出的順序。
方法一:? ?時間復雜度O(nk)? k是最長的字符串長度,n是字符串的數量
記錄字符串中每個字母出現的次數,映射到哈希表中,如果兩個字符串含有的字母相同且數量一致,則說明是一類
class Solution {
? ? public static List<List<String>> groupAnagrams(String[] strs) {
?? ??? ? List<List<String>> result = new ArrayList<List<String>>();
?? ??? ? boolean used[] = new boolean[strs.length];
?? ??? ? int i,j;
?? ??? ? for(i=0;i<strs.length;i++)
?? ??? ? {
?? ??? ??? ? List<String> temp = null;
?? ??? ??? ? if(used[i]!=true)? //used用來表示當前字符串是否已被添加過
?? ??? ??? ? {
?? ??? ??? ??? ? temp = new ArrayList<String>();
?? ??? ? ? ? ? ? temp.add(strs[i]);
?? ??? ??? ??? ? for(j=i+1;j<strs.length;j++)
?? ??? ??? ??? ? {
?? ??? ??? ??? ??? ? if(used[j]==false&&equals(strs[i],strs[j])==true)
?? ??? ??? ??? ??? ? {
?? ??? ??? ??? ??? ??? ? used[j] = true;
?? ??? ??? ??? ??? ??? ? temp.add(strs[j]);
?? ??? ??? ??? ??? ? }
?? ??? ??? ??? ? }
?? ??? ??? ? }
?? ??? ??? ? if(temp!=null)
?? ??? ??? ? {
?? ??? ??? ??? ? result.add(temp);
?? ??? ??? ? }
?? ??? ? }
?? ??? ? return result;
?? ? ? ?}
?? ? public static boolean equals(String a,String b)
?? ? {
?? ??? ? Map<Character,Integer> map = new HashMap<>();
?? ??? ? int i;
?? ??? ? for(i=0;i<a.length();i++)//將第一個字符串各字母的數量記錄下來
?? ??? ? {
?? ??? ??? ? if(map.containsKey(a.charAt(i)))
?? ??? ??? ? {
?? ??? ??? ??? ? map.put(a.charAt(i), map.get(a.charAt(i))+1);//如果已經有這個字母,那數量加一
?? ??? ??? ? }
?? ??? ??? ? else
?? ??? ??? ? {
?? ??? ??? ??? ? map.put(a.charAt(i), 1);/如果還沒有這個字母,添加進去,數量置為1
?? ??? ??? ? }
?? ??? ? }
?? ??? ? for(i=0;i<b.length();i++)? //比較字符串b和a含有的字母種類,數量是否一致
?? ??? ? {
?? ??? ??? ? if(map.containsKey(b.charAt(i)))
?? ??? ??? ? {
?? ??? ??? ??? ? map.put(b.charAt(i), map.get(b.charAt(i))-1);//如果哈希表中有b的這個字母,那數量減一
?? ??? ??? ? }
?? ??? ??? ? else
?? ??? ??? ? {
?? ??? ??? ??? ? return false; //如果沒有,說明兩個就不是一類
?? ??? ??? ? }
?? ??? ? }
?? ??? ? Set<Character> set = map.keySet();//最后哈希表中各值為0,說明是一類
?? ??? ? for(char c:set)
?? ??? ? {
?? ??? ??? ? if (map.get(c) != 0)?
?? ??? ??? ? {
?? ??? ? ? ? ? ? ? return false;
?? ??? ? ? ? }
?? ??? ? }
?? ??? ?return true;
?? ??? ??
?? ? }
}
方法二:
將每個字符串按照字母順序排序,這樣的話就可以把 eat,tea,ate 都映射到 aet。其他的類似。
class?Solution?{
????public?List<List<String>>?groupAnagrams(String[]?strs)?{
????????HashMap<String,?List<String>>?hash?=?new?HashMap<>();
????????????for?(int?i?=?0;?i?<?strs.length;?i++)?{
????????????????char[]?s_arr?=?strs[i].toCharArray();
????????????????Arrays.sort(s_arr);//對當前字符串進行排序
????????????????String?key?=?String.valueOf(s_arr); //將排序后的字符串作為一個key
????????????????if?(hash.containsKey(key))?{
????????????????????hash.get(key).add(strs[i]); //如果包含這個key,那添加進這個key對應的value
????????????????}?else?{
????????????????????List<String>?temp?=?new?ArrayList<String>();
????????????????????temp.add(strs[i]);
????????????????????hash.put(key,?temp);//如果不包含,創建一個新的key,進行添加
????????????????}
?
????????????}
????????????return?new?ArrayList<List<String>>(hash.values());?
?????????
????}
}
總結
以上是生活随笔為你收集整理的Leetcode--49. 字母异味词分组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC与三层架构的联系及三层架构实现学生
- 下一篇: volatile关键字解析