【发布时间】:2013-11-22 03:12:55
【问题描述】:
给定一个单词列表,找到两个字符串S 和T,这样:
-
S和T没有共同特征 -
S.length() * T.length()已最大化
我的方法是,首先为每个字符串构建位图并尝试找到最大乘数。你能给我一个时间复杂度小于 O(n2) 的更好的算法吗?
public class biggest_multiply {
int biggest(String[] array){
if(array==null||array.length<=1)
return 0;
class bitMap{
int bit;
String s;
}
bitMap[] bm=new bitMap[array.length];
for(int i=0;i<array.length;i++){
bm[i]=new bitMap();
for(int j=0;j<array[i].length();j++)
bm[i].bit=bm[i].bit|(1<<(array[i].charAt(j)-'a'));
bm[i].s=array[i];
}
int maximum=0;
for(int i=0;i<array.length;i++){
for(int j=i+1;j<array.length;j++)
if((bm[i].bit&bm[j].bit)==0)
maximum=Math.max(maximum, bm[i].s.length()*bm[j].s.length());
}
return maximum;
}
public static void main(String[] args){
System.out.println(new biggest_multiply().biggest(new String[]{"aa","aabb","bb","cc"}));
}
}
【问题讨论】:
-
至少尝试一下自己的作业问题。
-
这不是作业..我在网上看到它并认为这是一个有趣的问题。我只能想到为每个字符串的字符制作哈希集或位图并一一比较。但是,找到最大化的乘法结果成本 O(n^2)...
-
这很难。元素区别问题告诉我们,我们无法确定两个单词是否在优于 O(m lg m) 的时间内没有共同字符(假设平均单词长度为 m)。对于摊销情况,也许有更好的算法,但我不知道。我们可以使用哈希表在 O(m) 时间内“打破”这个边界,但这假设了一个恒定时间的哈希函数,等等。