Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.
Each letter in the magazine string can only be used once in your ransom note.
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:
理解错误,以为magazine中必须含有和ransomNote中长度顺序一样的部分。看了测试cases发现,无需顺序一样。所以一开始想复杂了,思路如下:
When return true?
The magazine have string Y which is same as ransomNote.
so the len(Y) = len(ransomNote)
if Y == ransomNote:
return true
What is Y?
I try to get Y from magazine by magazine[0:len(ransomNote)].
After each time compare Y with ransomNote, I need to move the first element from magazine.
magazine = magazine[1:]
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
if ransomNote + magazine == "": return True
else:
for i in magazine:
cut_list = magazine[0:len(ransomNote)]
print(ransomNote,cut_list)
if ransomNote == cut_list:
return True
magazine = magazine[1:]
坑2:
I got the error " NameError: name ‘true’ is not defined".
Because in the question always use “true” of “false” as the result, I use “return true” rather than “return True” when I was coding.
So!!!!!This question is verrrrrrrrry easy!!! I throught toooo much…
Right answer:
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
for i in ransomNote:
if i in magazine:
magazine = magazine.replace(i,"",1)
else:
return False
return True