Ransom Note - tanakakenji/Rinko GitHub Wiki

ใฏใ„ใ€ๆ‰ฟ็Ÿฅใ„ใŸใ—ใพใ—ใŸใ€‚ไปฅไธ‹ใซๅ•้กŒใฎๅ›ž็ญ”ใจ่งฃ่ชฌใ‚’็คบใ—ใพใ™ใ€‚

ๅ•้กŒ:

2ใคใฎๆ–‡ๅญ—ๅˆ— ransomNote ใจ magazine ใŒไธŽใˆใ‚‰ใ‚ŒใŸใจใใ€magazine ใฎๆ–‡ๅญ—ใ‚’ไฝฟใฃใฆ ransomNote ใ‚’ๆง‹็ฏ‰ใงใใ‚‹ๅ ดๅˆใฏ true ใ‚’ใ€ใใ†ใงใชใ„ๅ ดๅˆใฏ false ใ‚’่ฟ”ใ—ใฆใใ ใ•ใ„ใ€‚

magazine ใฎๅ„ๆ–‡ๅญ—ใฏ ransomNote ใงไธ€ๅบฆใ—ใ‹ไฝฟ็”จใงใใพใ›ใ‚“ใ€‚

ไพ‹:

Example 1:

Input: ransomNote = "a", magazine = "b"
Output: false
Example 2:

Input: ransomNote = "aa", magazine = "ab"
Output: false
Example 3:

Input: ransomNote = "aa", magazine = "aab"
Output: true

ๅˆถ็ด„:

1 <= ransomNote.length, magazine.length <= 10^5
ransomNote ใจ magazine ใฏๅฐๆ–‡ๅญ—ใฎ่‹ฑๅญ—ใงๆง‹ๆˆใ•ใ‚Œใฆใ„ใพใ™ใ€‚

ๅ›ž็ญ”ใจ่งฃ่ชฌ:

ใ“ใฎๅ•้กŒใงใฏใ€magazine ๆ–‡ๅญ—ๅˆ—ใซๅซใพใ‚Œใ‚‹ๆ–‡ๅญ—ใ‚’ไฝฟใฃใฆ ransomNote ๆ–‡ๅญ—ๅˆ—ใ‚’ๆง‹็ฏ‰ใงใใ‚‹ใ‹ใฉใ†ใ‹ใ‚’ๅˆคๅฎšใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚้‡่ฆใชใฎใฏใ€magazine ใฎๅ„ๆ–‡ๅญ—ใฏไธ€ๅบฆใ—ใ‹ไฝฟ็”จใงใใชใ„ใจใ„ใ†ๅˆถ็ด„ใงใ™ใ€‚

ใ“ใฎๅ•้กŒใ‚’่งฃๆฑบใ™ใ‚‹ๅŠน็އ็š„ใชใ‚ขใƒ—ใƒญใƒผใƒใฏใ€ๅ„ๆ–‡ๅญ—ใฎๅ‡บ็พๅ›žๆ•ฐใ‚’ใ‚ซใ‚ฆใƒณใƒˆใ™ใ‚‹ใ“ใจใงใ™ใ€‚

ใ‚ขใƒ—ใƒญใƒผใƒ 1: ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ— (่พžๆ›ธ) ใ‚’ไฝฟ็”จใ™ใ‚‹

  1. magazine ใฎๆ–‡ๅญ—้ ปๅบฆใ‚’ใ‚ซใ‚ฆใƒณใƒˆใ™ใ‚‹:

    • magazine ๆ–‡ๅญ—ๅˆ—ใ‚’ๅๅพฉๅ‡ฆ็†ใ—ใ€ๅ„ๆ–‡ๅญ—ใฎๅ‡บ็พๅ›žๆ•ฐใ‚’ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ— (ใพใŸใฏ่พžๆ›ธ) ใซๆ ผ็ดใ—ใพใ™ใ€‚ใ‚ญใƒผใฏๆ–‡ๅญ—ใ€ๅ€คใฏใใฎๅ‡บ็พๅ›žๆ•ฐใงใ™ใ€‚
  2. ransomNote ใฎๆ–‡ๅญ—ใ‚’ใƒใ‚งใƒƒใ‚ฏใ™ใ‚‹:

    • ransomNote ๆ–‡ๅญ—ๅˆ—ใ‚’ๅๅพฉๅ‡ฆ็†ใ—ใพใ™ใ€‚
    • ransomNote ใฎๅ„ๆ–‡ๅญ—ใซใคใ„ใฆใ€magazine ใฎ้ ปๅบฆใƒžใƒƒใƒ—ใซใใฎๆ–‡ๅญ—ใŒๅญ˜ๅœจใ—ใ€ใ‹ใคๅ‡บ็พๅ›žๆ•ฐใŒ 0 ใ‚ˆใ‚Šๅคงใใ„ใ‹ใ‚’็ขบ่ชใ—ใพใ™ใ€‚
      • ๆ–‡ๅญ—ใŒๅญ˜ๅœจใ—ใ€ๅ‡บ็พๅ›žๆ•ฐใŒๆญฃใฎๅ ดๅˆใ€ใใฎๆ–‡ๅญ—ใ‚’ ransomNote ใงไฝฟ็”จใ™ใ‚‹ใŸใ‚ใ€้ ปๅบฆใƒžใƒƒใƒ—ใ‹ใ‚‰ใใฎๆ–‡ๅญ—ใฎๅ‡บ็พๅ›žๆ•ฐใ‚’ 1 ๆธ›ใ‚‰ใ—ใพใ™ใ€‚
      • ๆ–‡ๅญ—ใŒๅญ˜ๅœจใ—ใชใ„ใ‹ใ€ๅ‡บ็พๅ›žๆ•ฐใŒ 0 ใฎๅ ดๅˆใ€ransomNote ใ‚’ๆง‹็ฏ‰ใงใใชใ„ใŸใ‚ใ€false ใ‚’่ฟ”ใ—ใพใ™ใ€‚
  3. ๆˆๅŠŸ:

    • ransomNote ใฎใ™ในใฆใฎๆ–‡ๅญ—ใ‚’ๅ•้กŒใชใๅ‡ฆ็†ใงใใŸๅ ดๅˆใ€ransomNote ใฏ magazine ใ‹ใ‚‰ๆง‹็ฏ‰ๅฏ่ƒฝใงใ‚ใ‚‹ใŸใ‚ใ€true ใ‚’่ฟ”ใ—ใพใ™ใ€‚

Python ใงใฎๅฎŸ่ฃ…ไพ‹:

from collections import Counter

def canConstruct(ransomNote: str, magazine: str) -> bool:
    magazine_counts = Counter(magazine)
    for char in ransomNote:
        if magazine_counts[char] > 0:
            magazine_counts[char] -= 1
        else:
            return False
    return True

# ไพ‹
print(canConstruct("a", "b"))      # Output: False
print(canConstruct("aa", "ab"))     # Output: False
print(canConstruct("aa", "aab"))    # Output: True

่งฃ่ชฌ:

  • Counter(magazine) ใฏใ€magazine ๆ–‡ๅญ—ๅˆ—ๅ†…ใฎๅ„ๆ–‡ๅญ—ใฎๅ‡บ็พๅ›žๆ•ฐใ‚’ใ‚ซใ‚ฆใƒณใƒˆใ—ใ€่พžๆ›ธใฎใ‚ˆใ†ใชใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’ไฝœๆˆใ—ใพใ™ใ€‚
  • ransomNote ใฎๅ„ๆ–‡ๅญ—ใซใคใ„ใฆใ€magazine_counts ใซใใฎๆ–‡ๅญ—ใŒๅญ˜ๅœจใ—ใ€ใ‹ใคๅ‡บ็พๅ›žๆ•ฐใŒ 0 ใ‚ˆใ‚Šๅคงใใ„ใ‹ใ‚’็ขบ่ชใ—ใฆใ„ใพใ™ใ€‚
  • ๆกไปถใ‚’ๆบ€ใŸใ™ๅ ดๅˆใ€magazine_counts[char] -= 1 ใงใใฎๆ–‡ๅญ—ใฎไฝฟ็”จๅ›žๆ•ฐใ‚’ๆธ›ใ‚‰ใ—ใพใ™ใ€‚
  • ใ‚‚ใ— magazine_counts[char] ใŒ 0 ไปฅไธ‹ใฎๅ ดๅˆใ€ใใฎๆ–‡ๅญ—ใฏ magazine ใซไธ่ถณใ—ใฆใ„ใ‚‹ใ‹ใ€ใ™ใงใซไฝฟใ„ๆžœใŸใ•ใ‚Œใฆใ„ใ‚‹ใŸใ‚ใ€False ใ‚’่ฟ”ใ—ใพใ™ใ€‚
  • ใƒซใƒผใƒ—ใŒๅฎŒไบ†ใ™ใ‚Œใฐใ€ransomNote ใฏ magazine ใ‹ใ‚‰ๆง‹็ฏ‰ๅฏ่ƒฝใงใ‚ใ‚‹ใŸใ‚ใ€True ใ‚’่ฟ”ใ—ใพใ™ใ€‚

ใ‚ขใƒ—ใƒญใƒผใƒ 2: ้…ๅˆ—ใ‚’ไฝฟ็”จใ™ใ‚‹ (ๅฐๆ–‡ๅญ—ใฎ่‹ฑๅญ—้™ๅฎš)

ransomNote ใจ magazine ใŒๅฐๆ–‡ๅญ—ใฎ่‹ฑๅญ—ใฎใฟใงๆง‹ๆˆใ•ใ‚Œใฆใ„ใ‚‹ใจใ„ใ†ๅˆถ็ด„ใ‚’ๅˆฉ็”จใ—ใฆใ€้…ๅˆ—ใ‚’ไฝฟใฃใฆๆ–‡ๅญ—้ ปๅบฆใ‚’็ฎก็†ใ™ใ‚‹ใ“ใจใ‚‚ใงใใพใ™ใ€‚

  1. magazine ใฎๆ–‡ๅญ—้ ปๅบฆใ‚’ใ‚ซใ‚ฆใƒณใƒˆใ™ใ‚‹:

    • ้•ทใ• 26 ใฎ้…ๅˆ— (ใพใŸใฏใƒชใ‚นใƒˆ) ใ‚’็”จๆ„ใ—ใ€ๅ„ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใ‚’ใ‚ขใƒซใƒ•ใ‚กใƒ™ใƒƒใƒˆใฎๅ„ๆ–‡ๅญ—ใซๅฏพๅฟœใ•ใ›ใพใ™ (ไพ‹: ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น 0 ใฏ 'a'ใ€ใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น 1 ใฏ 'b' ใชใฉ)ใ€‚
    • magazine ๆ–‡ๅญ—ๅˆ—ใ‚’ๅๅพฉๅ‡ฆ็†ใ—ใ€ๅ„ๆ–‡ๅญ—ใซๅฏพๅฟœใ™ใ‚‹้…ๅˆ—ใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใฎๅ€คใ‚’ใ‚คใƒณใ‚ฏใƒชใƒกใƒณใƒˆใ—ใพใ™ใ€‚
  2. ransomNote ใฎๆ–‡ๅญ—ใ‚’ใƒใ‚งใƒƒใ‚ฏใ™ใ‚‹:

    • ransomNote ๆ–‡ๅญ—ๅˆ—ใ‚’ๅๅพฉๅ‡ฆ็†ใ—ใพใ™ใ€‚
    • ransomNote ใฎๅ„ๆ–‡ๅญ—ใซใคใ„ใฆใ€ๅฏพๅฟœใ™ใ‚‹้…ๅˆ—ใฎใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นใฎๅ€คใŒ 0 ใ‚ˆใ‚Šๅคงใใ„ใ‹ใ‚’็ขบ่ชใ—ใพใ™ใ€‚
      • ๅ€คใŒๆญฃใฎๅ ดๅˆใ€ใใฎๆ–‡ๅญ—ใ‚’ ransomNote ใงไฝฟ็”จใ™ใ‚‹ใŸใ‚ใ€้…ๅˆ—ใฎๅ€คใ‚’ 1 ใƒ‡ใ‚ฏใƒชใƒกใƒณใƒˆใ—ใพใ™ใ€‚
      • ๅ€คใŒ 0 ใฎๅ ดๅˆใ€ransomNote ใ‚’ๆง‹็ฏ‰ใงใใชใ„ใŸใ‚ใ€false ใ‚’่ฟ”ใ—ใพใ™ใ€‚
  3. ๆˆๅŠŸ:

    • ransomNote ใฎใ™ในใฆใฎๆ–‡ๅญ—ใ‚’ๅ•้กŒใชใๅ‡ฆ็†ใงใใŸๅ ดๅˆใ€ransomNote ใฏ magazine ใ‹ใ‚‰ๆง‹็ฏ‰ๅฏ่ƒฝใงใ‚ใ‚‹ใŸใ‚ใ€true ใ‚’่ฟ”ใ—ใพใ™ใ€‚

Python ใงใฎๅฎŸ่ฃ…ไพ‹ (้…ๅˆ—ใ‚’ไฝฟ็”จ):

def canConstruct_array(ransomNote: str, magazine: str) -> bool:
    alphabet = [0] * 26
    for char in magazine:
        alphabet[ord(char) - ord('a')] += 1

    for char in ransomNote:
        index = ord(char) - ord('a')
        if alphabet[index] > 0:
            alphabet[index] -= 1
        else:
            return False
    return True

# ไพ‹
print(canConstruct_array("a", "b"))      # Output: False
print(canConstruct_array("aa", "ab"))     # Output: False
print(canConstruct_array("aa", "aab"))    # Output: True

ๆ™‚้–“่จˆ็ฎ—้‡:

  • ใฉใกใ‚‰ใฎใ‚ขใƒ—ใƒญใƒผใƒใ‚‚ใ€magazine ใจ ransomNote ใฎๆ–‡ๅญ—ๅˆ—ใ‚’ใใ‚Œใžใ‚Œไธ€ๅบฆๅๅพฉๅ‡ฆ็†ใ™ใ‚‹ใŸใ‚ใ€ๆ™‚้–“่จˆ็ฎ—้‡ใฏ O(m + n) ใงใ™ใ€‚ใ“ใ“ใงใ€m ใฏ magazine ใฎ้•ทใ•ใ€n ใฏ ransomNote ใฎ้•ทใ•ใงใ™ใ€‚

็ฉบ้–“่จˆ็ฎ—้‡:

  • ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ—ใ‚’ไฝฟ็”จใ™ใ‚‹ใ‚ขใƒ—ใƒญใƒผใƒใงใฏใ€ๆœ€ๆ‚ชใฎๅ ดๅˆใ€magazine ใซๅซใพใ‚Œใ‚‹ใ™ในใฆใฎใƒฆใƒ‹ใƒผใ‚ฏใชๆ–‡ๅญ—ใ‚’ๆ ผ็ดใ™ใ‚‹ใŸใ‚ใ€็ฉบ้–“่จˆ็ฎ—้‡ใฏ O(k) ใงใ™ใ€‚ใ“ใ“ใงใ€k ใฏ magazine ๅ†…ใฎใƒฆใƒ‹ใƒผใ‚ฏใชๆ–‡ๅญ—ใฎๆ•ฐใงใ™ใ€‚
  • ้…ๅˆ—ใ‚’ไฝฟ็”จใ™ใ‚‹ใ‚ขใƒ—ใƒญใƒผใƒใงใฏใ€ๅธธใซๅ›บๅฎšใ‚ตใ‚คใ‚บใฎ้…ๅˆ— (้•ทใ• 26) ใ‚’ไฝฟ็”จใ™ใ‚‹ใŸใ‚ใ€็ฉบ้–“่จˆ็ฎ—้‡ใฏ O(1) ใงใ™ใ€‚

็ต่ซ–:

ใฉใกใ‚‰ใฎใ‚ขใƒ—ใƒญใƒผใƒใ‚‚ๅŠน็އ็š„ใงใ™ใŒใ€้…ๅˆ—ใ‚’ไฝฟ็”จใ™ใ‚‹ใ‚ขใƒ—ใƒญใƒผใƒใฏใ€ๅ•้กŒใฎๅˆถ็ด„ (ๅฐๆ–‡ๅญ—ใฎ่‹ฑๅญ—ใฎใฟ) ใ‚’ๅˆฉ็”จใ™ใ‚‹ใ“ใจใงใ€ใ‚ใšใ‹ใซ็ฉบ้–“ๅŠน็އใŒ่‰ฏใใชใ‚Šใพใ™ใ€‚ใƒใƒƒใ‚ทใƒฅใƒžใƒƒใƒ—ใ‚’ไฝฟ็”จใ™ใ‚‹ใ‚ขใƒ—ใƒญใƒผใƒใฏใ€ใ‚ˆใ‚Šไธ€่ˆฌ็š„ใชๆ–‡ๅญ—ใ‚ปใƒƒใƒˆใซๅฏพๅฟœใงใใพใ™ใ€‚