2135. 统计追加字母可以获得的单词数(Rating 1828)
2135. 统计追加字母可以获得的单词数(Rating 1828)
以下内容偏向于记录个人练习过程及思考,非常规题解内容
题目
思路
按照题意,输入的字符串中任意字母至多出现1次,且字母顺序并不重要。
因此可以用一个32位数表示字符串,每一位表示一个字母,如第0位表示a,第1位表示b,以此类推。
因此本题就转换为了一个位运算的问题。考虑
遍历start中的字符串,获得其对应的num
遍历26个字母,如果对应字母位为0,考虑将其置为1时是否在target中存在即可。
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def wordCount(self, startWords: List[str], targetWords: List[str]) -> int:
m, n = len(startWords), len(targetWords)
targetNums = defaultdict(lambda: 0) # 维护一个target字典,包含每个字符串的数量
for idx, word in enumerate(targetWords):
num = 0
for c in word:
num += 1 << (ord(c) - ord('a'))
targetNums[num] += 1
ret = 0
for idx, word in enumerate(startWords):
num = 0
for c in word: # 遍历字符串,获得其对应的32位数
num += 1 << (ord(c) - ord('a'))
for b in range(26):
if (num >> b) & 1: # 只判断对应位为0的位置
continue
if num + (1 << b) in targetNums: # 存在,则更新答案 & 更新target字典
ret += targetNums[num + (1 << b)]
targetNums.pop(num + (1 << b))
return ret
本文由作者按照 CC BY 4.0 进行授权