問題
我們有兩個數組A和B的單詞。每個單詞都是一串小寫字母。現在,假設單詞b是單詞a的子集如果b中的每個字母都出現在a中,並且可以出現多次。例如,“wrr”是“warrior”的子集,但不是“world”的子集。現在說一個來自a的詞a是普遍的如果對於b中的每一個b, b是a的子集。返回a中所有通用單詞的列表。這些單詞的順序可以是任意的。
解析
題目很直觀,同樣我們給出一個更加直觀的解法。我們先將字符串數組B中出現的所有字符保存下來,並記錄次數(注意,字符串內的相同字符計數,字符串間的相同字符取最大值)。然後和A數組中的字符串逐一對比(遍歷一次),如果字符串的字符出現次數小於我們記錄的次數,那麼該字符串就不符合要求。並且時間複雜度爲,其中m,n分別爲兩個字符串數組的長度。
Java代碼
public List<String> wordSubsets(String[] A, String[] B) {
int countsB[] = new int[26];
for(int i=0;i<B[0].length();i++){
countsB[B[0].charAt(i)-'a']++;
}
for(int i=0;i<B.length;i++){
int temp[] = new int[26];
for(char c:B[i].toCharArray()){
temp[c-'a']++;
countsB[c-'a']=Math.max(countsB[c-'a'],temp[c-'a']);
}
}
List<String> list = new ArrayList();
for(int i=0;i<A.length;i++){
int temp[] = new int[26];
boolean flag = true;
for(char c:A[i].toCharArray()){
temp[c-'a']++;
}
for(int j=0;j<26;j++){
if(temp[j]<countsB[j]) {
flag =false;
break;
}
}
if(flag){
list.add(A[i]);
}
}
return list;
}