一魚多吃 用XOR性質來解 字串的差異Find the Difference Leetcode #389

更新於 發佈於 閱讀時間約 2 分鐘
raw-image

這題的題目在這裡

題目給定兩個字串s和t,t是s隨機打散後的字串,並且在t裡面額外多加了一個字元,要求我們找出額外多加入的那個字元。


測試範例:

Example 1:

Input: s = "abcd", t = "abcde"
Output: "e"
Explanation: 'e' is the letter that was added.

Example 2:

Input: s = "", t = "y"
Output: "y"

約束條件:

Constraints:

  • 0 <= s.length <= 1000
  • t.length == s.length + 1
  • s and t consist of lowercase English letters.(只會有小寫英文字母)

演算法:

除了傳統字典去記錄出現次數的方法以外,

其實,也可以用到前面在Single Number學過的技巧,用XOR self-inverse的特質,來消去成雙成對的元素。

Self-inverse :

A ⊕ A = 0

題目已經說t 和 s 是重新隨機打散過的排列,只額外多加入了一個字元。

令我們所求的字元為target。也就是說,除了target以外的字元,都成雙成對出現,一次出現在s,一次出現在t

全部用迴圈掃描一遍,同時滾動計算XOR的值,最後留下來的剛好就會是我們的所求target,也就是額外多加入的那一個字元。


程式碼:

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

  # Each character appear twice, one in s, the other in t.
  # The extra one only shows up once in t.

  letter = 0
  for char in s:
   letter ^= ord(char)
  
  for char in t:
   letter ^= ord(char)
   
  return chr(letter)

時間複雜度:

O( m+n ) 用線性掃描分別掃描兩個字串,s和t。

空間複雜度:

O(1) 只用了固定尺寸的臨時變數,所佔用空間為常數級別,為O(1)


最後學完這題,記得去複習 Single Number 這一題,兩者用到的都是同一個很實用的XOR運算子的性質 Self inverse A ⊕ A = 0


Reference:

[1] LeetCode - The World's Leading Online Programming Learning Platform





avatar-img
91會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給定一個陣列,每個數字都恰好出現兩次,只有一個數字是例外。 要求我們找出那個落單也就是例外的數字。
如同這個Dynamic programming 深入淺出系列的開始, 在經過比較簡單的入門題(Coin Change)之後, 來看比較進階的二維DP題目Unique Path
爬到頂樓的最小成本, 這題算是前面那題Climbing stairs的變形題,有點小變化, 但是稍微想一下還是能推導出來,算是很好的一維動態規劃1D DP練習題。
今天再來看一題入門的2D DP題目: 巴斯卡三角形 再次複習Dynamic programming的解題框架,可分為三大步驟 1.定義狀態 [我在哪裡] 2. 定義狀態轉移關係式(通則) [我從哪裡來] => [答案從哪裡推導而來] 3. 釐清初始狀態(也可以說是遞
題目會給定一個字串,問我們裡面最大的回文子字串內容為何? 本題目將用中心展開法來解題
題目會給定一個陣列,每個數字都恰好出現兩次,只有一個數字是例外。 要求我們找出那個落單也就是例外的數字。
如同這個Dynamic programming 深入淺出系列的開始, 在經過比較簡單的入門題(Coin Change)之後, 來看比較進階的二維DP題目Unique Path
爬到頂樓的最小成本, 這題算是前面那題Climbing stairs的變形題,有點小變化, 但是稍微想一下還是能推導出來,算是很好的一維動態規劃1D DP練習題。
今天再來看一題入門的2D DP題目: 巴斯卡三角形 再次複習Dynamic programming的解題框架,可分為三大步驟 1.定義狀態 [我在哪裡] 2. 定義狀態轉移關係式(通則) [我從哪裡來] => [答案從哪裡推導而來] 3. 釐清初始狀態(也可以說是遞
題目會給定一個字串,問我們裡面最大的回文子字串內容為何? 本題目將用中心展開法來解題
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
今天要來討論 1 + "1" 。 如果當兩個操作數都是數字時,+ 會執行數字相加。例如,1 + 1 結果是 2。 那如果是"1"+"1",就變成字符串相加變成11。 那我們今天要講的是1 + "1",答案是11,為甚麼呢? 這是一個類型強制轉換,今天當 + 遇到不一樣的類型時,JavaScrip
Thumbnail
在比賽裡這就是大家拚手速的題目了,準備好了嗎?
Thumbnail
可選串聯(?.)運算符用於訪問 object 的屬性或調用函數。如果使用該運算符訪問的object 或調用的函式為 undefined 或 null,則表達式會回傳 undefined,而不是拋出錯誤。
Thumbnail
題目 : 28. Find the Index of the First Occurrence in a String
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
今天要來討論 1 + "1" 。 如果當兩個操作數都是數字時,+ 會執行數字相加。例如,1 + 1 結果是 2。 那如果是"1"+"1",就變成字符串相加變成11。 那我們今天要講的是1 + "1",答案是11,為甚麼呢? 這是一個類型強制轉換,今天當 + 遇到不一樣的類型時,JavaScrip
Thumbnail
在比賽裡這就是大家拚手速的題目了,準備好了嗎?
Thumbnail
可選串聯(?.)運算符用於訪問 object 的屬性或調用函數。如果使用該運算符訪問的object 或調用的函式為 undefined 或 null,則表達式會回傳 undefined,而不是拋出錯誤。
Thumbnail
題目 : 28. Find the Index of the First Occurrence in a String