387. 字符串中的第一个唯一字符
https://leetcode.cn/problems/first-unique-character-in-a-string/
队列 哈希表 字符串 计数
方法一:哈希表
class Solution:
def firstUniqChar(self, s: str) -> int:
# 哈希表
# counter统计每个字符出现的次数
counter = {}
for le in s:
if le in counter:
counter[le] += 1
else:
counter[le] = 1
for idx, ch in enumerate(s):
if counter[ch] == 1:
return idx
return -1
方法二:哈希表优化
方法三:队列
383.赎金信
https://leetcode.cn/problems/ransom-note/
哈希表 字符串 计数
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
我的思路:用一个哈希表counter记录ransomNote中的字符和字符个数,遍历magazine中的元素,如果元素在counter中,则counter中该字符的个数减1。如果counter中各字符的个数等于0或者小于0,说明 ransomNote 能由 magazine 里面的字符构成,否则不能。
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
counter = {}
for le in ransomNote:
if le in counter:
counter[le] += 1
else:
counter[le] = 1
for ch in magazine:
if ch in counter:
counter[ch] -= 1
for c in counter:
if counter[c] > 0:
return False
return True
官方解法一:
只需要满足字符串 magazine 中的每个英文字母 (’a’-’z’) 的统计次数都大于等于 ransomNote 中相同字母的统计次数即可。
官方代码:
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
if len(ransomNote) > len(magazine):
return False
return not collections.Counter(ransomNote) - collections.Counter(magazine)
和我的理解其实是一致的。
242. 有效的字母异位词
https://leetcode.cn/problems/valid-anagram/
哈希表 字符串 排序
我的思路:首先,如果这两个字符串长度不相等,一定不是有效的字母异位词。如果长度相等,则判断字符元素出现的次数是否相等。
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
if len(s) != len(t): return False
counter = {}
for le in s:
if le in counter:
counter[le] += 1
else:
counter[le] = 1
for ch in t:
if ch in counter:
counter[ch] -= 1
for c in counter:
if counter[c] != 0:
return False
return True
另一种写法,更好理解
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
record = [0] * 26
if len(s) != len(t):
return False
for i in range(len(s)):
record[ord(s[i]) - ord('a')] += 1
record[ord(t[i]) - ord('a')] -= 1
print(record)
for j in range(26):
if record[j] != 0:
return False
break
return True