LeetCode318刷题之位运算的学习

2 篇文章 0 订阅
1 篇文章 0 订阅

LeetCode318刷题记录

题目描述

给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。

我一开始的方法

无他,遍历而已。只有一个测试用例是不能通过的,该测试用例极长,很明显我这样的遍历超时了,代码如下:

class Solution1 {
  
	public int maxProduct(String[] words) {
    	int cfz;
    	
    	int maxLen=0;
    	
    	if(words.length<2) {
    		return 0;
    	}else {
    	for(int i=0;i<words.length-1;i++) {
    	
    		for(int j=i+1;j<words.length;j++) {
    			cfz=0;
    			for(int a=0;a<words[i].length();a++) {
    				for(int b=0;b<words[j].length();b++) {
    					
    					if(words[i].charAt(a)==words[j].charAt(b)) {
    						cfz++;
    						break;
    					}
    				}
    				if(cfz!=0) break;
    			}
    			if(cfz!=0) {continue;}else {
    				maxLen=Math.max(words[i].length()*words[j].length(), maxLen);
    				System.out.println(words[i]);
    				System.out.println(words[j]+"\n");
    			}
    		}
    		
    		}
    	  return maxLen;
    	}
     
    }
}
 

我明明已经设置过代码片了怎么不是我之前的那个炫酷黑。。算了这个不重要

大神的解法

看到大神的解法,有种五雷轰顶的感觉。我们都知道int类型是可以保存到232的 ,也就是转化成二进制是有32位的。而英文字母只有26个,所以我们可以先遍历每个单词,记录一下出现的字母,出现就在对应位置上记录1,没有出现就是0.然后再让新数组中的数字互相做个&的位运算

class Solutiontoe {
    public int maxProduct(String[] words) {
    	int maxLen=0;
    	int[] wordsN=new int[words.length];
    	for(int i=0;i<words.length;i++) {
    		for(int j=0;j<words[i].length();j++) {
    			wordsN[i]|=1<<(words[i].charAt(j)-'a');
    		}
    		
    	}
    	
    	for(int i=0;i<words.length;i++) {
    		for(int j=i+1;j<words.length;j++) {
    			if ((wordsN[i]&wordsN[j])==0) {
    				maxLen=maxLen<(words[i].length()*words[j].length())?(words[i].length()*words[j].length()):maxLen;
    			//java问号表达式,为真,则表达为冒号前面的;为假,则表达为后面的
    			}
    		}
    	}
    	return maxLen;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值