字串應用題 最少需要幾個步驟讓兩個字串變成"同字母異序詞" Leetcode #1347

閱讀時間約 5 分鐘

題目敘述

題目會給我們兩個字串作為輸入,分別是字串s和字串t,問我最少要做幾次字元轉換,讓字串t和字串s成為Anagram"同字母異序詞"?

註: 例如 god 和 dog 就是 Anagram 同字母異序詞,也是就說,組成字母相同,但是順序可以重新排列。

題目的原文敘述


測試範例

Example 1:

Input: s = "bab", t = "aba"
Output: 1
Explanation: Replace the first 'a' in t with b, t = "bba" which is anagram of s.
把字串t中的一個a改成b,字串​s和字串t就是Anagram 同字母異序詞

Example 2:

Input: s = "leetcode", t = "practice"
Output: 5
Explanation: Replace 'p', 'r', 'a', 'i' and 'c' from t with proper characters to make t anagram of s.

Example 3:

Input: s = "anagram", t = "mangaar"
Output: 0
Explanation: "anagram" and "mangaar" are anagrams.
不用特別調整​,原本就是Anagram同字母異序詞

約束條件

Constraints:

  • 1 <= s.length <= 5 * 10^4

字串s的長度介於1~5*10^4之間。

  • s.length == t.length

字串s的長度 = 字串t的長度。

  • s and t consist of lowercase English letters only.

字串s和字串t裡面只會有小寫英文字母。


演算法

其實依照定義出發即可。

這題的目標是讓兩個字串成為Anagram 同字母異序詞,

關鍵就在於,每個曾經出現的英文字母的出現次數必須相同。

到這邊,可以很直覺的聯想到用字典dictionary(或者稱 雜湊映射表Hash table)來實作。

建立兩個字典s_occ_dict,t_occ_dict分別統計兩個字串各自的字母出現次數。

然後,計算出現次數差值的絕對值總和,每做一次字元轉換,就代表有一個舊字元減少出現一次,一個新字元多出現一次,一來一回等於重複計算,最後再除以2,扣掉重複的部分,就是所需字元轉換的次數的最小值。


程式碼

from collections import defaultdict
from string import ascii_lowercase

class Solution:
def minSteps(self, s: str, t: str) -> int:

# dictionary
# key : alphabet letter
# value : occurrence
s_occ_dict = defaultdict( int )
t_occ_dict = defaultdict( int )

# build the dictionary for input string s
for ch in s:
s_occ_dict[ch] += 1

# build the dictionary for input string t
for ch in t:
t_occ_dict[ch] += 1


# counting the minimum distance to anagram
diff = 0

for ch in ascii_lowercase:

diff += abs(s_occ_dict[ch] - t_occ_dict[ch])

return diff//2


關鍵知識點

這題的目標是讓兩個字串成為Anagram 同字母異序詞,

關鍵就在於,每個曾經出現的英文字母的出現次數必須相同。

到這邊,可以很直覺的聯想到用字典dictionary(或者稱 雜湊映射表Hash table)來實作。


複雜度分析

時間複雜度:

從頭到尾掃描過每個字元,所需時間為O(n) = O(字串長度)

空間複雜度:

因為題目已經給了一個很強的條件,字串s和字串t裡面只會有小寫英文字母,所以字典的大小最大就是統計每個小寫字母的出現次數=O(26)=O(1) 常數級別


Reference:

[1] Minimum Number of Steps to Make Two Strings Anagram - LeetCode

53會員
342內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
創作者要怎麼好好休息 + 避免工作過量?《黑貓創作報#4》午安,最近累不累? 這篇不是虛假的關心。而是《黑貓創作報》發行以來可能最重要的一篇。 是的,我們這篇講怎麼補充能量,也就是怎麼休息。
Thumbnail
avatar
黑貓老師
2024-06-29
防曬產品係數測試報告彙整(2024年)從2014年起,自己對於市售防曬產品的效能產生了濃厚的興趣。因為當時候發現不少產品的防曬係數其實標示是有問題的,像是原本應該是人體測試的SPF與PA數值,實際上沒有做,只用機器測試的數據來充當,但這兩者卻有很大的差異。像是防曬係數其實有強度、廣度與平均度三個面向需要一起判斷,但多數廠商並沒有完整標示
Thumbnail
avatar
邱品齊皮膚科醫師
2023-04-27
每一個人需要的只是做最好的自己最近跟八字個案諮詢的內容,這真的是仍然不變的經典...我放不下某某某,我得不到某某的愛,我很聽話我很努力做了什麼,我努力討好但還是得不到....而事實上,很多人與人之間的事,根本不能靠“努力”讓自己如何,就能輕易的被改變... 我真的只能心疼的說.... 世間萬物的定律,幾億的人口,數不清的
Thumbnail
avatar
呂芸芸佛系療癒美胸保健師
2023-12-13
檸檬讀書_《怎麼做出最好選擇?人人都需要的行為經濟學》 感謝快樂文化的洪絹分享的好書。 身為一個理科人, 看到「經濟學」三個字, 我還是抖了一下~~ 💰但是,我非常愉快的看完這本書, 還學到了不少小技巧, 簡單說, 這是一本探討大家怎麼花錢的書。 (真的就是這麼簡單, 絕對是小學生看得懂的等級) 從出版社的介紹就可以
Thumbnail
avatar
lemon li
2023-11-16
情緒化人也需要至少七年去制約週期這是一個巨大的轉變,不是自私的,因為每一個轉變自己的情感人都會轉變環境的一部分。任何進入他們 Aura(能量場)的人都會受到影響。所需要的只是慢慢接受去制約的時間。
Thumbnail
avatar
守候正確邀請的PROJECTOR
2022-03-18
水是最好的藥 身體需要水46理由大公開水是最好的藥 身體需要水46理由大公開 📷📷​ 「水是最好的藥」書籍< 身體需要水46理由 > 巴特曼醫學博士:你沒病,只是渴了! 他從3000位病人從飲對好水中都改善現況,一書出版被翻譯成16種語言,美國35次刷。 1.假如沒有水任何生命都不可能存在 3.水是能量主要來源,是身體流動資金
Thumbnail
avatar
Head團長 太赫茲水儀
2021-12-24
彈道必須要有高,才能產生最好距離!大家都會為增加距離而努力,而距離的產生和你的身體與揮桿速度有關,當然我在以前的文章裡,討論很多有關球桿對於距離的影響。而今天會討論更加深入!雖然說現有科技和材質的進步加持下,對於彈道的高低在距離影響都沒有以往的大,但其實中低彈道的打法有一個致命點,就是它需要靠滾動來得到最好距離。 其實彈道這個東西
Thumbnail
avatar
chien
2021-11-06
每月定期定額買ETF,什麼時候買有差嗎? 至少需要抱多久呢?定期定額投資ETF的方法,確定要投資哪一個ETF標的之後,就不用再煩惱選股。 如果定期的日期不同,會影響我的最後報酬嗎? 影響的程度有多大? 如果我只想先嘗試投資個1-2年也會賺錢嗎? 為了回答這兩個問題,我做了回測,得到了明確的答案
Thumbnail
avatar
Marra
2020-11-05
敬!咆哮二十:不被世界需要的時候,至少還有這裡需要我。@台北電影節電影使用許多短篇故事,訴說名為「咆哮二十」的酒吧所發生的故事。一個人喝酒也許孤單,一群人喝酒也許能品嘗快樂,在這間酒吧裡,就訴說著類似的故事。
Thumbnail
avatar
天野由紀
2020-06-26
副總統:全球疫情緩和至少需要兩個月撰寫:吳卓遠 副總統陳建仁3月23日晚間於Facebook以“新冠肺炎發生率、致死率與病毒檢驗陽性率的相關分析”為題發表了他對於疫情的評估,並說明台灣為何無需採行普遍檢驗的防疫策略。 擁有公共衛生專業背景的陳建仁表示,全球新冠肺炎的疫情仍處在上升的階段,至少還要兩個月的時間才會緩和。他指出台灣因
Thumbnail
avatar
多維TW
2020-03-24
劉仲敬訪談 058 @ 20191009 論解放軍要對香港實施戒嚴至少還需要準備好幾個月香港跟上海一樣,是中國人民站起來了的一個主要標誌。 鄧小平敏銳地看到,這個標誌有巨大的政治價值,無論如何要把這個標誌搶到手,而且還要實現共產黨篡奪國民黨長期從事的反帝鬥爭的最後一步。 所以,人民解放軍作為一個象徵物,是必須派進去的。 至於從軍事上管不管用,當時沒有任何人認為香港有可能發生任何戰爭,所
Thumbnail
avatar
陳易宏
2019-10-20