Вопрос:
Используя пары слов из словаря, не содержащие общих букв, найдите пару, которая максимизирует сумму длин слов.
Пример словаря: мышь, корова, соединение, ключ, собака
собака и ключ не имеют одинаковых букв и имеют сумму 3+3 = 6
мышь не работает с коровой, присоединиться или собакой, так как все они имеют общую букву "о"
join и key не имеют общих букв и имеют сумму 4+3 = 7
У меня был этот вопрос в интервью, мое решение, которое я придумал, описано ниже. Мне было интересно, есть ли способ сделать его более эффективным? Я использовал два BitSets
для сопоставления алфавита двух слов и И их вместе, чтобы увидеть, содержат ли они одни и те же буквы. Я думаю, что сложность моего алгоритма равна o(n!), что неэффективно. Есть ли лучший способ оптимизировать мой алгоритм?
public static void maximumSum (String[] dictionary) {
// ascii of a = 97
BitSet word1 = new BitSet(26);
BitSet word2 = new BitSet(26);
String maxWord1 = "";
String maxWord2 = "";
int maxSum = -1;
for(int i = 0; i<dictionary.length; i++) {
for(int j = i+1; j<dictionary.length; j++) {
String s1 = dictionary[i];
String s2 = dictionary[j];
for(int k = 0; k<s1.length(); k++) {
word1.set(s1.charAt(k)-97);
}
for(int k = 0; k<s2.length(); k++) {
word2.set(s2.charAt(k)-97);
}
word1.and(word2);
if(word1.cardinality() == 0) {
if(maxSum < s1.length()+s2.length()) {
maxWord1 = s1;
maxWord2 = s2;
maxSum = s1.length()+s2.length();
}
}
word1.clear();
word2.clear();
}
}
if(maxSum == -1)
System.out.println("All the words have letters in common.");
else
System.out.println("'"+maxWord1+"' and '"+maxWord2+"'
have a maximum sum of "+maxSum);
}
public static void main(String[] args) {
String[] dictionary = {"mouse", "cow", "join", "key", "dog"};
maximumSum(dictionary);
}
выход:
'join' and 'key' have a maximum sum of 7