Leecode-Go - 矩陣置零(字符串相關)
現在給定兩個字符串,分別是 ransomNote 和 magazine,當前需要我們做的是判斷 ransomNote 能不能由 magazine 裏面的字符構成,如果可以的話,需要我們返回 true,否則就需要返回 false,需要我們注意的是,magazine 中的每個字符只能在 ransomNote 中使用一次。
可以提示的內容如下:
-
1 <= ransomNote.length, magazine.length <= 105。
-
ransomNote 和 magazine 都是由小寫英文字母組成。
這個題目按我個人的理解來說,可以認爲是字符串查找,也就是查找 magazine 裏面的字符是否完全包含 ransomNote 裏面的字符。
換個角度來理解,將 magazine 每個字符做鍵值,之後將每個字符出現的次數記錄下來,我們定義爲 ranMap,之後循環 ransomNote 字符串,再將剛剛得到的字符數組 ranMap 每個鍵值對應的數字遞減。
最終只要 ranMap 中每個鍵值的數字小於等於零,那麼我們就可以確認 magazine 裏面的字符完全包含 ransomNote 裏面的字符,反之就可以確認 magazine 裏面的字符不完全包含 ransomNote 裏面的字符。
接下來我們按上述思路用代碼來實現:
func canConstruct(ransomNote string, magazine string) bool {
ranMap := make(map[string]int)
for _, v := range ransomNote {
fmt.Println(v)
ranMap[string(v)]++
}
for _, v := range magazine {
ranMap[string(v)]--
}
for _, v := range ranMap {
if v > 0 {
return false
}
}
return true
}
將上述代碼提交後,Leecode 那邊通過是通過了,但是效率不是很理想,之後看了別人的例子才發現自己真的是井底之蛙,思路走窄了。。。
來看下這位大神的代碼:
func canConstruct(ransomNote string, magazine string) bool {
var cnt [26]int
for _, v := range magazine {
cnt[v-'a']++
}
for _, v := range ransomNote {
cnt[v-'a']--
if cnt[v-'a'] < 0 {
return false
}
}
return true
}
各位慢慢品鑑,有問題加好友隨時溝通哈~
至此,本次分享就結束了,後期會慢慢補充。
以上僅爲個人觀點,不一定準確,能幫到各位那是最好的。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/W6aommJSPmeRFE9hvh3HHA