2021-12-10每日一题

给你一个字符串 licensePlate 和一个字符串数组 words ,请你找出并返回 words 中的 最短补全词 。

补全词 是一个包含 licensePlate 中所有的字母的单词。在所有补全词中,最短的那个就是 最短补全词 。

在匹配 licensePlate 中的字母时:

  • 忽略 licensePlate 中的 数字和空格 。
  • 不区分大小写。
  • 如果某个字母在 licensePlate 中出现不止一次,那么该字母在补全词中的出现次数应当一致或者更多。

例如:licensePlate = "aBc 12c",那么它的补全词应当包含字母 'a''b' (忽略大写)和两个 'c' 。可能的 补全词 有 "abccdef""caaacab" 以及 "cbca" 。

请你找出并返回 words 中的 最短补全词 。题目数据保证一定存在一个最短补全词。当有多个单词都符合最短补全词的匹配条件时取 words 中 最靠前的 那个。

 1 public class ShortestCompletingWord {
 2     public String shortestCompletingWord(String licensePlate, String[] words) {
 3         String s = licensePlate.toLowerCase();
 4         int[] num=new int[26];
 5         for (int i = 0; i < s.length(); i++) {
 6             if (s.charAt(i)>='a'&s.charAt(i)<='z'){
 7                 num[s.charAt(i)-'a']++;
 8             }
 9         }
10         int ans=-1;
11         for (int i = 0; i < words.length; i++) {
12             int[] temp=new int[26];
13             for (int j = 0; j < words[i].length(); j++) {
14                 temp[words[i].charAt(j)-'a']++;
15             }
16             boolean flag=true;
17             for (int j = 0; j < num.length; j++) {
18                 if (temp[j]<num[j]){
19                     flag=false;
20                     break;
21                 }
22             }
23             if (flag){
24                 if (ans==-1){
25                     ans=i;
26                 }else if (words[i].length()<words[ans].length()){
27                     ans=i;
28                 }
29             }
30         }
31         return words[ans];
32     }
33 
34 
35     public static void main(String[] args) {
36         String a="1s3 PSt";
37         String[] b={"step", "steps", "stripe", "stepple"};
38         System.out.println(new ShortestCompletingWord().shortestCompletingWord(a, b));
39     }
40 }

先转化为小写,然后用26个空间的数组记录每个字母出现的次数。

遍历words,判断每个单词是否出现字符次数超过原单词,记录最短最靠前的索引。

posted on 2021-12-10 16:08  阿ming  阅读(13)  评论(0编辑  收藏  举报

导航