<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 0049. 字母異位詞分組 ## 題目地址(49. 字母異位詞分組) <https://leetcode-cn.com/problems/group-anagrams/> ## 題目描述 ``` <pre class="calibre18">``` 給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。 示例: 輸入: ["eat", "tea", "tan", "ate", "nat", "bat"] 輸出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ] 說明: 所有輸入均為小寫字母。 不考慮答案輸出的順序。 ``` ``` ## 前置知識 - 哈希表 - 排序 ## 公司 - 阿里 - 騰訊 - 百度 - 字節 ## 思路 一個簡單的解法就是遍歷數組,然后對每一項都進行排序,然后將其添加到 hashTable 中,最后輸出 hashTable 中保存的值即可。 這種做法空間復雜度 O(n), 假設排序算法用的快排,那么時間復雜度為 O(n \* klogk), n 為數組長度,k 為字符串的平均長度 代碼: ``` <pre class="calibre18">``` <span class="hljs-keyword">var</span> groupAnagrams = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">strs</span>) </span>{ <span class="hljs-keyword">const</span> hashTable = {}; <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sort</span>(<span class="hljs-params">str</span>) </span>{ <span class="hljs-keyword">return</span> str.split(<span class="hljs-string">""</span>).sort().join(<span class="hljs-string">""</span>); } <span class="hljs-title">// 這個方法需要排序,因此不是很優,但是很直觀,容易想到</span> <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-params">0</span>; i < strs.length; i++) { <span class="hljs-keyword">const</span> str = strs[i]; <span class="hljs-keyword">const</span> key = sort(str); <span class="hljs-keyword">if</span> (!hashTable[key]) { hashTable[key] = [str]; } <span class="hljs-keyword">else</span> { hashTable[key].push(str); } } <span class="hljs-keyword">return</span> <span class="hljs-params">Object</span>.values(hashTable); }; ``` ``` 下面我們介紹另外一種方法,我們建立一個 26 長度的 counts 數組(如果區分大小寫,我們可以建立 52 個,如果支持其他字符依次類推)。 然后我們給每一個字符一個固定的數組下標,然后我們只需要更新每個字符出現的次數。 最后形成的 counts 數組如果一致,則說明他們可以通過 交換順序得到。這種算法空間復雜度 O(n), 時間復雜度 O(n \* k), n 為數組長度,k 為字符串的平均長度. ![](https://img.kancloud.cn/51/59/5159fecf7b59a60336c762dede9225c8_830x328.jpg) ## 關鍵點解析 - 桶排序 ## 代碼 - 語言支持: Javascript,Python3 ``` <pre class="calibre18">``` <span class="hljs-title">/* * @lc app=leetcode id=49 lang=javascript * * [49] Group Anagrams */</span> <span class="hljs-title">/** * @param {string[]} strs * @return {string[][]} */</span> <span class="hljs-keyword">var</span> groupAnagrams = <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params">strs</span>) </span>{ <span class="hljs-title">// 類似桶排序</span> <span class="hljs-keyword">let</span> counts = []; <span class="hljs-keyword">const</span> hashTable = {}; <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-params">0</span>; i < strs.length; i++) { <span class="hljs-keyword">const</span> str = strs[i]; counts = <span class="hljs-params">Array</span>(<span class="hljs-params">26</span>).fill(<span class="hljs-params">0</span>); <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> j = <span class="hljs-params">0</span>; j < str.length; j++) { counts[str[j].charCodeAt(<span class="hljs-params">0</span>) - <span class="hljs-string">"a"</span>.charCodeAt(<span class="hljs-params">0</span>)]++; } <span class="hljs-keyword">const</span> key = counts.join(<span class="hljs-string">""</span>); <span class="hljs-keyword">if</span> (!hashTable[key]) { hashTable[key] = [str]; } <span class="hljs-keyword">else</span> { hashTable[key].push(str); } } <span class="hljs-keyword">return</span> <span class="hljs-params">Object</span>.values(hashTable); }; ``` ``` Python3 Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Solution</span>:</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">groupAnagrams</span><span class="hljs-params">(self, strs: List[str])</span> -> List[List[str]]:</span> <span class="hljs-string">""" 思路同上,在Python中,這里涉及到3個知識點: 1. 使用內置的 defaultdict 字典設置默認值; 2. 內置的 ord 函數,計算ASCII值(等于chr)或Unicode值(等于unichr); 3. 列表不可哈希,不能作為字典的鍵,因此這里轉為元組; """</span> str_dict = collections.defaultdict(list) <span class="hljs-keyword">for</span> s <span class="hljs-keyword">in</span> strs: s_key = [<span class="hljs-params">0</span>] * <span class="hljs-params">26</span> <span class="hljs-keyword">for</span> c <span class="hljs-keyword">in</span> s: s_key[ord(c)-ord(<span class="hljs-string">'a'</span>)] += <span class="hljs-params">1</span> str_dict[tuple(s_key)].append(s) <span class="hljs-keyword">return</span> str_dict.values() ``` ``` **復雜度分析** 其中 N 為 strs 的長度, M 為 strs 中字符串的平均長度。 - 時間復雜度:O(N?M)O(N \* M)O(N?M) - 空間復雜度:O(N?M)O(N \* M)O(N?M) 大家對此有何看法,歡迎給我留言,我有時間都會一一查看回答。更多算法套路可以訪問我的 LeetCode 題解倉庫:<https://github.com/azl397985856/leetcode> 。 目前已經 37K star 啦。 大家也可以關注我的公眾號《力扣加加》帶你啃下算法這塊硬骨頭。 ![](https://img.kancloud.cn/cf/0f/cf0fc0dd21e94b443dd8bca6cc15b34b_900x500.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看