748.最短补全词
题目描述
思路
统计字符出现次数
根据题意,我们先统计licensePlate中每个字母的出现次数(忽略大小写),然后遍历words中的每个单词,若26个字母在该单词中的出现次数均不小于在licensePlate中的出现次数,则该单词是一个补全词。返回最短且最靠前的补全词。
Java实现
class Solution {
public String shortestCompletingWord(String licensePlate, String[] words) {
int[] cnt = new int[26];
for (int i = 0; i < licensePlate.length(); ++i) {
char ch = licensePlate.charAt(i);
if (Character.isLetter(ch)) {
++cnt[Character.toLowerCase(ch) - 'a'];
}
}
int idx = -1;
for (int i = 0; i < words.length; ++i) {
int[] c = new int[26];
for (int j = 0; j < words[i].length(); ++j) {
char ch = words[i].charAt(j);
++c[ch - 'a'];
}
boolean ok = true;
for (int j = 0; j < 26; ++j) {
if (c[j] < cnt[j]) {
ok = false;
break;
}
}
if (ok && (idx < 0 || words[i].length() < words[idx].length())) {
idx = i;
}
}
return words[idx];
}
}
Python实现
class Solution:
def shortestCompletingWord(self, licensePlate: str, words: List[str]) -> str:
cnt = Counter(ch.lower() for ch in licensePlate if ch.isalpha())
return min((word for word in words if not cnt - Counter(word)), key=len)