leetcode 438. Find All Anagrams in a String | 438. 找到字符串中所有字母异位词(Java)
生活随笔
收集整理的這篇文章主要介紹了
leetcode 438. Find All Anagrams in a String | 438. 找到字符串中所有字母异位词(Java)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
https://leetcode.com/problems/find-all-anagrams-in-a-string/
題解
方法1:嘗試構造一種“與順序無關的哈希”
思考
是否可以構造順序無關的哈希?例如,我們希望 aabc 與 bcaa 的哈希值相同。
思路
找到一種映射方式,使得在保證每一個字母都出現在 set 中的情況下,讓不同字母具有不同的貢獻度,計算每個字母的貢獻度求 sum,從而實現“不同數量的字母組成的不同序列具有唯一 sum,相同數量的字母組合具有相同 sum,結果與順序無關”。
結果
上述“映射方式”可以被證明是不存在的。
我仍然用代碼實現了一遍,沒想到 AC 了。方法有邏輯問題,但是通過了所有的測試用例。
例如,a到z都包含在字符串中的情況下,只要找到 a+b = c+d,就是反例。
反例
a aac bcdefghijklmnopqrstuvwxyz
a bbb bcdefghijklmnopqrstuvwxyz
其中,中間部分的 a+a+c = b+b+b
證偽
以下步驟可以證明 一定存在反例:
手動構造的一個最簡單的反例:
方法2:
定義兩個數組:
- target[26] 數組,統計目標窗口內每個字母的個數。
- cur[26] 數組,統計當前滑窗內每個字母的個數。
- dif 為兩數組之間個數不相等的字母總數。
先固定好窗口大小,每次雙指針前進1。
然后在固定窗口大小的基礎上,觀察操作前后的變化:
- 如果操作前cur=dif,則dif+1
- 如果操作后cur=dif,則dif-1
總結
以上是生活随笔為你收集整理的leetcode 438. Find All Anagrams in a String | 438. 找到字符串中所有字母异位词(Java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 437. Path S
- 下一篇: leetcode 954. Array