目录
一.题目
1.给你一个字符串 licensePlate
和一个字符串数组 words
,请你找出 words
中的 最短补全词 。
补全词 :是一个包含 licensePlate
中所有字母的单词。忽略 licensePlate
中的 数字和空格 。不区分大小写。如果某个字母在 licensePlate
中出现不止一次,那么该字母在补全词中的出现次数应当一致或者更多。
例如:licensePlate
= "aBc 12c"
,那么它的补全词应当包含字母 'a'
、'b'
(忽略大写)和两个 'c'
。可能的 补全词 有 "abccdef"
、"caaacab"
以及 "cbca"
。
要求:请返回 words
中的 最短补全词 。题目数据保证一定存在一个最短补全词。当有多个单词都符合最短补全词的匹配条件时取 words
中 第一个 出现的那个
示例 1:
输入:licensePlate = "1s3 PSt", words = ["step", "steps", "stripe", "stepple"] 输出:"steps" 解释:最短补全词应该包括 "s"、"p"、"s"(忽略大小写) 以及 "t"。 "step" 包含 "t"、"p",但只包含一个 "s",所以它不符合条件。 "steps" 包含 "t"、"p" 和两个 "s"。 "stripe" 缺一个 "s"。 "stepple" 缺一个 "s"。 因此,"steps" 是唯一一个包含所有字母的单词,也是本例的答案。
二.解题思路(看的题解)
1.先将licensePlate中包含的字母及其个数求出来,用一个数组存储
2.再将words中的单词一个一个用同样的方法取出字母并放在另一个数组存储
3.将两个数组进行比较判断word是否满足补全词的条件
4.将补全词的下标用idx存储
5.判定补全词是否是最短补全词,并更新idx
三.代码
class Solution {
public String shortestCompletingWord(String licensePlate, String[] words) {
int[] scout = new int[26];
for(int i=0;i<licensePlate.length();i++){//求licensePlaite包含的字母及其个数
char ch = licensePlate.charAt(i);
if(Character.isLetter(ch)){
scout[Character.toLowerCase(ch)-'a']++;
}
}
int idx=-1;
for(int i=0;i<words.length;i++){
int[] ct = new int[26];
for(int j=0;j<words[i].length();j++){//取单个word并求出该单词包含的字母及其个数
char ch = words[i].charAt(j);
ct[ch-'a']++;
}
boolean flag = true;
for(int j=0;j<26;j++){//判断word是否包含相应个数的字母
if(ct[j]<scout[j]){
flag=false;
break;
}
}
if(flag&&(idx<0||words[idx].length()>words[i].length()))//求到最短补全词
idx=i;
}
return words[idx];
}
}
四.题后语(
)
题目没看完整,我的问题,写这道题的时候题没有看完整,只看到了licensePlate,没有看到words,让我一下无从下手,想不明白是怎么得到的最短补全词,这个单词从哪里取出来的。让我一度以为是有一个包存储了所以单词,然后我看了解析,也没有发现那个地方有调一个神奇的包,甚至第二个部分我都不知道在干什么。以为是把字符串分析了几遍然后生成的单词,然后我重新认认真真的看了一遍题目,好家伙,原来words是这么个东西,真的是蠢到家了。