刷题记录 | 拼写单词 + 单词拆分 + 前k个高频单词

拼写单词

给你一份『词汇表』(字符串数组) 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),即先按照频数的倒数排序(即保证了频数降序排列),
# 然后对于相同频数的单词再比价大小(题中说按照字母顺序,就正好对应字母升序)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值