leetcode916

单词子集

我们给出两个单词数组 A 和 B。每个单词都是一串小写字母。

现在,如果 b 中的每个字母都出现在 a 中,包括重复出现的字母,那么称单词 b是单词 a 的子集。 例如,“wrr” 是 “warrior” 的子集,但不是 “world” 的子集。

如果对 B 中的每一个单词 bb 都是 a 的子集,那么我们称 A 中的单词 a 是通用的

你可以按任意顺序以列表形式返回 A 中所有的通用单词。

 

示例 1:

输入: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^8

优化一下之后通过

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;
    }
}

 

转载于:https://www.cnblogs.com/HannahLihui/p/10163323.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值