题目地址:
https://leetcode.com/problems/shortest-completing-word/
给定一个长 n n n的字符串 s s s和一个英文小写单词数组 A A A,找到 A A A中最短的包含了 s s s中所有英文字母的子串(不区分大小写,但次数要考虑)。如果有若干个长度相同的答案,则返回第一个出现的。
代码如下:
public class Solution {
public String shortestCompletingWord(String licensePlate, String[] words) {
int[] count = new int[26];
for (int i = 0; i < licensePlate.length(); i++) {
char ch = licensePlate.charAt(i);
if (Character.isLetter(ch)) {
count[Character.toLowerCase(ch) - 'a']++;
}
}
String res = "";
for (String word : words) {
int[] curCount = new int[26];
for (int i = 0; i < word.length(); i++) {
curCount[word.charAt(i) - 'a']++;
}
if (!check(count, curCount)) {
continue;
}
if (res.isEmpty() || word.length() < res.length()) {
res = word;
}
}
return res;
}
private boolean check(int[] count, int[] curCount) {
for (int i = 0; i < 26; i++) {
if (curCount[i] < count[i]) {
return false;
}
}
return true;
}
}
时间复杂度 O ( l s + n l ) O(l_s+nl) O(ls+nl), l l l是 A A A中最长单词长度,空间 O ( 1 ) O(1) O(1)。