日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode--49. 字母异味词分组

發布時間:2024/7/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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. 字母异味词分组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。