Leecode-Go - 矩陣置零(字符串相關)

現在給定兩個字符串,分別是 ransomNote 和 magazine,當前需要我們做的是判斷 ransomNote 能不能由 magazine 裏面的字符構成,如果可以的話,需要我們返回 true,否則就需要返回 false,需要我們注意的是,magazine 中的每個字符只能在 ransomNote 中使用一次。

可以提示的內容如下:

  1. 1 <= ransomNote.length, magazine.length <= 105。

  2. 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