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,判断每个单词是否出现字符次数超过原单词,记录最短最靠前的索引。