Хорошо, если кто-то идет на хэширование:
public static int uniqueChars(String first, String second) {
boolean[] hash = new boolean[26];
int count = 0;
//reduce first string to unique letters
for (char c : first.toLowerCase().toCharArray()) {
hash[c - 'a'] = true;
}
//reduce to unique letters in both strings
for(char c : second.toLowerCase().toCharArray()){
if(hash[c - 'a']){
count++;
hash[c - 'a'] = false;
}
}
return count;
}
Это использует сортировку по сегментам, которая дает сложность n + m, но требует 26 сегментов (массив "hash").Мне кажется, что нельзя добиться большего успеха в отношении сложности, так как вам нужно хотя бы раз взглянуть на каждую букву, которая суммирует до n + m.
Insitu лучшее, что вы можете получить, это imho где-то в диапазоне O(n log (n)).
Ваш подход находится где-то в лиге O (n²)
Аддон: если вам нужны символы в виде строки (по сути то же самое, что и выше сcount - длина возвращаемой строки):
public static String uniqueChars(String first, String second) {
boolean[] hash = new boolean[26];
StringBuilder sb = new StringBuilder();
for (char c : first.toLowerCase().toCharArray()) {
hash[c - 'a'] = true;
}
for(char c : second.toLowerCase().toCharArray()){
if(hash[c - 'a']){
sb.append(c);
hash[c - 'a'] = false;
}
}
return sb.toString();
}