成都游戲網(wǎng)站開發(fā)代發(fā)關(guān)鍵詞排名包收錄
242.有效的字母異位詞
數(shù)組、set、map,數(shù)組是比較高效查找的
函數(shù)功能
判斷字符串 s
和 t
是否互為字母異位詞。如果它們包含相同的字符且每個字符出現(xiàn)的次數(shù)也相同,那么它們互為字母異位詞。
代碼邏輯
-
長度檢查:
if (s.length !== t.length) return false;
如果
s
和t
的長度不相等,它們不可能是字母異位詞,直接返回false
。 -
初始化計數(shù)器數(shù)組:
const resSet = new Array(26).fill(0); const base = "a".charCodeAt();
resSet
是一個長度為 26 的數(shù)組,用于存儲每個小寫字母的出現(xiàn)次數(shù)(假設(shè)s
和t
只包含小寫字母)。base
存儲了字母 'a' 的 ASCII 碼值,用于將字母轉(zhuǎn)換為數(shù)組索引。
-
統(tǒng)計
s
中字符出現(xiàn)次數(shù):for (const i of s) { resSet[i.charCodeAt() - base]++; }
遍歷字符串
s
,使用charCodeAt()
函數(shù)獲取每個字符的 ASCII 碼值,然后根據(jù)base
計算出索引,增加resSet
中相應(yīng)位置的計數(shù)。 -
驗證
t
中的字符:for (const i of t) { if (!resSet[i.charCodeAt() - base]) return false; resSet[i.charCodeAt() - base]--; }
- 遍歷字符串
t
,對于每個字符,檢查resSet
中對應(yīng)位置的計數(shù)。如果計數(shù)為 0,則表示t
中有一個在s
中不存在的字符,或者字符出現(xiàn)次數(shù)不匹配,返回false
。 - 減少
resSet
中相應(yīng)位置的計數(shù)。
- 遍歷字符串
-
返回結(jié)果:
return true;
果代碼執(zhí)行到這里,說明
s
和t
是字母異位詞,返回true
。
總結(jié)
這個函數(shù)通過計數(shù)每個字符的出現(xiàn)次數(shù),來判斷兩個字符串是否互為字母異位詞。由于只用了一個固定長度的數(shù)組,它在處理只包含小寫字母的字符串時非常高效。
49字母異位詞
示例 1: 輸入 ["eat", "tea", "tan", "ate", "nat", "bat"]
-
初始化哈希表:
- 創(chuàng)建一個空的
Map
對象map
。
- 創(chuàng)建一個空的
-
遍歷字符串?dāng)?shù)組:
-
對于每個字符串
str
在數(shù)組["eat", "tea", "tan", "ate", "nat", "bat"]
中,執(zhí)行以下步驟:-
"eat":
- 分解、排序并重新組合:
"eat" -> ["e", "a", "t"] -> ["a", "e", "t"] -> "aet"
map.has("aet")
返回false
(因為 "aet" 還不在map
中),所以執(zhí)行map.set("aet", [])
并添加 "eat" 到 "aet" 鍵對應(yīng)的數(shù)組中。
- 分解、排序并重新組合:
-
"tea":
- 同樣地,
"tea"
排序后變?yōu)?"aet"
。 map.has("aet")
返回true
(因為 "aet" 已存在),所以直接將 "tea" 添加到 "aet" 鍵對應(yīng)的數(shù)組中。
- 同樣地,
-
"tan":
"tan"
排序后變?yōu)?"ant"
。map.has("ant")
返回false
,所以執(zhí)行map.set("ant", [])
并添加 "tan" 到 "ant" 鍵對應(yīng)的數(shù)組中。
-
"ate":
"ate"
排序后也是"aet"
。- 再次將 "ate" 添加到 "aet" 鍵對應(yīng)的數(shù)組中。
-
"nat":
"nat"
排序后變?yōu)?"ant"
。- 將 "nat" 添加到 "ant" 鍵對應(yīng)的數(shù)組中。
-
"bat":
"bat"
排序后變?yōu)?"abt"
。map.has("abt")
返回false
,所以執(zhí)行map.set("abt", [])
并添加 "bat" 到 "abt" 鍵對應(yīng)的數(shù)組中。
-
-
-
提取并返回結(jié)果:
- 使用
Array.from(map.values())
將map
中的所有值(即分組后的字符串?dāng)?shù)組)轉(zhuǎn)換為一個數(shù)組。 - 返回的數(shù)組是:
[["eat", "tea", "ate"], ["tan", "nat"], ["bat"]]
。
- 使用
結(jié)果解釋
函數(shù) groupAnagrams
將每個字符串按字母排序后,使用排序結(jié)果作為鍵來分組所有字母異位詞。最終返回的數(shù)組包含了分組好的字母異位詞數(shù)組,每個子數(shù)組包含所有字符集相同的原始字符串。在這個例子中,"eat"、"tea" 和 "ate" 互為字母異位詞,因此它們被分組在一起,同理可得其他分組。
438.找到字符串中所有字母異位詞?
-
初始化兩個計數(shù)器數(shù)組:
pCount
和sCount
分別用于存儲p
和窗口內(nèi)字符串的字符計數(shù)。 -
遍歷
p
:對p
中的每個字符進行計數(shù)。 -
滑動窗口:遍歷字符串
s
,同時更新sCount
數(shù)組來計算窗口內(nèi)各字符的出現(xiàn)次數(shù)。 -
窗口大小與
p
相等時:比較sCount
和pCount
。如果兩者完全一致,將左指針的位置加入結(jié)果數(shù)組。 -
移動窗口:右指針每向右移動一次,左指針也相應(yīng)地向右移動一次,以保持窗口大小不變。
這種方法通過在 s
上滑動一個固定大小的窗口并比較字符出現(xiàn)次數(shù),有效地找出了所有 p
的異位詞的起始索引。
?