判断字符串a是否是b的子集,就是看a的26个字母的词频,是否全都小于等于b的26个字母词频。分别统计a和b的26个字母的词频,分别用freqa和freqb表示,然后比较26个位置,如果freqa[i] < freqb[i]在 0 <= i <26始终成立,说明a是b的子集。
这题先把words2的每个元素的词频都统计一下,此时得到一个二维数组int[words2.length][26],然后转成一维数组,因为二维数组依次和words1的每个元素比较,一定超时。其实只需要得到words2中每个元素在26个字母出现频率的最大值即可,即一个int[26]数组,然后用words1中的每个元素和它比较词频,26个字母词频全都不大于的话,就加入答案。
class Solution {
public List<String> wordSubsets(String[] words1, String[] words2) {
int[][] freq2 = new int[words2.length][26];
for(int i = 0; i < words2.length; i++){
for(char c2 : words2[i].toCharArray()){
freq2[i][c2 - 'a']++;
}
}
int[] simpleFreq2 = new int[26];
for(int i = 0; i < 26; i++){
for(int[] ff : freq2){
simpleFreq2[i] = Math.max(simpleFreq2[i], ff[i]);
}
}
List<String> ans = new ArrayList<>();
for(String w1 : words1){
if(valid(w1, simpleFreq2)){
ans.add(w1);
}
}
return ans;
}
private boolean valid(String s1, int[] simpleFreq2){
int[] freq1 = new int[26];
for(char c1 : s1.toCharArray()){
freq1[c1 - 'a']++;
}
for(int i = 0; i < 26; i++){
if(simpleFreq2[i] > freq1[i]){
return false;
}
}
return true;
}
}