LeetCode 49:異所性文字の単語パケットグループアナグラム
トピック:
一緒に文字列配列、異所性の単語文字を考えます。異所性ワード文字が同じ文字を指しますが、別の文字列に配置されています。
文字列の配列を指定して、グループが一緒にアナグラム。
例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
説明:
- すべての入力は小文字です。
- 考慮されていなかった答えの順番。
注意:
- すべての入力は小文字になります。
- あなたの出力の順序は重要ではありません。
問題解決のアイデア:
長いアルファベット順にすべての単語が良いの一定のルールに従って、限り、法律に基づいて、最大各ワード線内の文字の同じ文字列として、それはAに分類されるよう要求の対象は、長いクラスのようにアルファベット順で文字のプロパティと同じであるものは何でもカテゴリ
ソート文字の問題解決:
ハッシュマップ{Key : Value}
同じ文字のキーワードを保存するキー文字列がソートされ、値の配列、および各単語のトラバースは、ハッシュマップを使用して、ソートされた文字列がキーに存在しているかどうかを調べるために、文字を並べ替えシーク動作時間を短縮複雑O(1)
(アルファベットここを昇順で)解決どのロジック:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"]
建立哈希映射 map = {}
遍历该字符串数组:
第一个单词: "eat" --> "aet"
"aet" 不存在于 map, 建立映射 {"aet" : [ "eat" ] }
第二个单词: "tea" --> "aet"
"aet" 存在于 map, 加入其 Values {"aet" : [ "eat" , "tea" ] }
第三个单词: "tan" --> "ant"
"ant" 不存在于 map, 建立映射 {"aet" : [ "eat" , "tea" ] ; "ant" : [ "tan" ] }
第四个单词: "ate" --> "aet"
"aet" 存在于 map, 加入其 Values {"aet" : [ "eat" , "tea" , "ate" ] ; "ant" : [ "tan" ] }
......
map = {"aet" : [ "eat" , "tea" , "ate" ] ; "ant" : [ "tan" , "nat"] ; "abt" : [ "bat" ] }
返回该哈希映射的 Values 组成的数组:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
複雑さ:
時間計算量:O(N *(K * logK))、NはSTRSの長さであり、Kは、文字列STRSの最大長さです。O(N)の各列の複雑さを横断します。内蔵された文字列の時間の複雑さをソート文字を使用してソート機能は、O(K * logK)です。
宇宙複雑:O(N * K)、地図データ記憶領域に占めます。
単語頻度統計を問題解決:
この問題解決の方法はまた、文字列照合の操作を省略することができる再最適化されたことがあります。
、それについて26英語文字までの言葉を考えて、あなたはハッシュマップとしてそれを確立することはできません?:
对于单词 "aeat" :
建立哈希映射{ 'a' : 2 ; 'e' : 1; t : 1 }
キーワードが表示されて、値が周波数に現れます。あなたは同じ文字かどうかを決定するために、各キーを通過した後、明らかに、より複雑で出現数が同じ、かどうかを判断する場合。
各文字の出現頻度は、連続した文字で構成することができます。
每个字母 a-z 出现频次: [2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0]
组成字符串: "20001000000000000001000000"
単純に各単語の文字列の周波数は、その上に同じ時間があるかどうかを判断します。
あなたはまた、文字の単語を横断し、長さ26、そのインデックス位置に代わって26文字の直接の配列を確立し、単語の出現頻度の最適化のための固定26文字の数を求めることができ、それぞれの文字は、配列内の要素に代わって手紙一度表示されます値はプラス1。
これは、ソート操作を回避します
ソート文字の問題解決:
Javaの:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if(strs.length==0) return new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();//建立映射关系
for (String s : strs) {//遍历该字符串数组
char[] chs = s.toCharArray();//转成字符
Arrays.sort(chs);//排序字符串字母
String key = String.valueOf(chs);//转成字符串
if(!map.containsKey(key)) map.put(key, new ArrayList<>());//如果 key 不存在, 新建映射关系
map.get(key).add(s);//加入其对应的 Value 所在的数组
}
return new ArrayList(map.values());//返回 Values 组成的数组
}
}
Pythonの:
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
ans = collections.defaultdict(list) # 建立映射关系
for s in strs: # 遍历该字符串数组
ans[tuple(sorted(s))].append(s) # sorted(s):排序字符串字母, 并加入其对应的 Value 所在的数组
return ans.values() # 返回 Values 组成的数组
単語頻度統計を問題解決:
Javaの:
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
if (strs.length == 0) return new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();// 建立映射关系
for (String s : strs) {//遍历该字符串数组
int[] count = new int[26];//建立一个 26 字母的映射关系
for (char c : s.toCharArray()) count[c - 'a']++;//遍历字字符串每个字母统计每个字母出现的频次
String key = Arrays.toString(count);//转成字符串
if (!map.containsKey(key)) map.put(key, new ArrayList<>());//如果 key 不存在, 新建映射关系
map.get(key).add(s);//加入其对应的 Value 所在的数组
}
return new ArrayList(map.values());//返回 Values 组成的数组
}
}
Pythonの:
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
ans = collections.defaultdict(list)# 建立映射关系
for s in strs: # 遍历该字符串数组
count = [0] * 26 # 建立一个 26 字母的映射关系
for c in s: # 遍历字字符串每个字母
count[ord(c) - 97] += 1 # 每个字母出现的频次(元素值)加1
ans[tuple(count)].append(s) # 加入其对应的 Value 所在的数组
return ans.values() # 返回 Values 组成的数组
マイクロチャンネル公衆番号へようこそ注意:書き込み愛のバグ