相乘的兩個字符串長度的結果,發現兩個字符串S
和T
這樣的:如何最大限度地發揮,而不考慮單詞的列表共性
S
和T
沒有共同的性格S.length() * T.length()
是最大化
我的做法是,首先爲每個字符串構建位圖,並試圖找到最大乘數。你能給我一個更好的算法,其時間複雜度小於O(n )?
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"}));
}
}
至少嘗試一下你自己的家庭作業問題。 – chrylis
這不是一項家庭作業..我在網上看到它,並認爲這是一個有趣的問題。 我只能想到爲每個字符串的字符做hashset或bitmap並逐一比較。然而,找到最大化的乘法結果成本O(n^2)... – Lampard
這是一個艱難的。元素清晰度問題告訴我們,我們無法確定兩個單詞是否沒有比O(m lg m)時間更好的共同字符(假設平均字長爲m)。也許有一個更好的算法來攤銷的情況下,但我不知道任何。我們可以使用一個散列表爲O(m)時間「破壞」這個邊界,但假設一個恆定時間散列函數等。 –