咱們給出兩個單詞數組 A
和 B
。每一個單詞都是一串小寫字母。數組
如今,若是 b
中的每一個字母都出如今 a
中,包括重複出現的字母,那麼稱單詞 b
是單詞 a
的子集。 例如,「wrr」 是 「warrior」 的子集,但不是 「world」 的子集。app
若是對 B
中的每個單詞 b
,b
都是 a
的子集,那麼咱們稱 A
中的單詞 a
是通用的。優化
你能夠按任意順序以列表形式返回 A
中全部的通用單詞。google
示例 1:spa
輸入:A = ["amazon","apple","facebook","google","leetcode"], B = ["e","o"] 輸出:["facebook","google","leetcode"]
class Solution { public List<String> wordSubsets(String[] A, String[] B) { int[]isValid=new int[A.length]; for(int i=0;i<B.length;i++){ String b=B[i]; //int []arrInit=new int[26]; for(int h=0;h<A.length;h++){ if(isValid[h]==-1) continue;; int[]arr=new int[26]; for(int j=0;j<b.length();j++) arr[b.charAt(j)-'a']++; String a=A[h]; // System.out.print(arr['e'-'a']+" "); for(int j=0;j<a.length();j++){ if(arr[a.charAt(j)-'a']>0) arr[a.charAt(j)-'a']--; } // System.out.print(arr['e'-'a']+" "); for(int m=0;m<26;m++) if(arr[m]>0){ isValid[h]=-1; } if(isValid[h]!=-1) isValid[h]++; // System.out.println(isValid[h]); } } List<String>re=new ArrayList<String>(); for(int i=0;i<A.length;i++){ if(isValid[i]==B.length) re.add(A[i]); } return re; } }
這段代碼超時了,畢竟A,B的長度都10000了,複雜度怎麼着也有10^8code
優化一下以後經過blog
class Solution { public List<String> wordSubsets(String[] A, String[] B) { int arrInit[]=new int[26]; for(int i=0;i<B.length;i++){ int []arrTmp=new int[26]; String b=B[i]; for(int j=0;j<b.length();j++) arrTmp[b.charAt(j)-'a']++; for(int j=0;j<26;j++){ arrInit[j]=Math.max(arrTmp[j],arrInit[j]); } } //System.out.println(arrInit['e'-'a']+" "+arrInit['o'-'a']); int[]isValid=new int[A.length]; for(int i=0;i<A.length;i++){ int arr[]=new int[26]; System.arraycopy(arrInit,0,arr,0,26); String a=A[i]; for(int j=0;j<a.length();j++){ if(arr[a.charAt(j)-'a']>0) arr[a.charAt(j)-'a']--; } // System.out.print(arr['e'-'a']+" "); for(int m=0;m<26;m++) if(arr[m]>0){ isValid[i]=-1; break; } // System.out.println(isValid[i]); } List<String>re=new ArrayList<String>(); for(int i=0;i<A.length;i++){ if(isValid[i]==0) re.add(A[i]); } return re; } }