拼写单词
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。
返回词汇表 words 中你掌握的所有单词的 长度之和。
示例:
输入:words = ["cat","bt","hat","tree"], chars = "atach"
输出:6
解释:
可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。
思路:哈希表方法可以解决
Python 代码如下:
def countCharacters(self, words: List[str], chars: str) -> int:
char_cnt = collections.Counter(chars)
ans = 0
for word in words:
word_cnt = collections.Counter(word)
for c in word_cnt:
if char_cnt[c] < word_cnt[c]:
break
else:
ans += len(word)
return ans
这里值得学习的写法有:
# 统计一个单词中字母的数量
char_cnt = collections.Counter(char)
char_cnt = Counter({'a': 1, 'b': 2, 'f': 2, 'c': 1, 's': 1, 'e': 1, 'r': 1})
for c in char_cnt:
print(c)
a
b
f
c
s
e
r
for c in char_cnt.items():
print(c)
('a', 1)
('b', 2)
('f', 2)
('c', 1)
('s', 1)
('e', 1)
('r', 1)
单词拆分
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。
示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。
思路:采用动态规划。
def wordBreak(s, wordDict):
n = len(s)
dp = [False] * (n + 1)
dp[0] = True
for i in range(n):
for j in range(i + 1, n + 1):
if dp[i] and s[i:j] in wordDict:
dp[j] = True
return dp[-1]
前k个高频单词
给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
示例 1:
输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2
输出: ["i", "love"]
解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 "i" 在 "love" 之前。
解法:排序 + hash
def topKFrequent(self, words: List[str], k: int) -> List[str]:
hashmap = {}
for word in words:
if word in hashmap:
hashmap[word] += 1
else:
hashmap[word] = 1
hashmap = sorted(hashmap.items(), key = lambda item:(-item[1], item[0])
return [key for key, _ in hashmap[:k]]
# 这里比价关键的是sorted函数
# dic.items()将字典dic变成了可迭代对象,迭代key和对应的value
# 若sorted函数的参数key = lambda item: item[0] 表示按照字典的key进行排序
# 若sorted函数的参数key = lambda item: item[1] 表示按照字典的value进行排序
# key = lambda item: (-item[1],item[0])表示排序的依据是元组(-value,key),即先按照频数的倒数排序(即保证了频数降序排列),
# 然后对于相同频数的单词再比价大小(题中说按照字母顺序,就正好对应字母升序)