4 回答

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
您必須將所有Strings 轉(zhuǎn)換為Setof Characters 并保留第一個(gè)中的所有內(nèi)容。下面的解決方案有很多可以優(yōu)化的地方,但你應(yīng)該理解一般的想法。
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Main {
public static void main(String[] args) {
List<String> input = Arrays.asList("jonas", "ton", "bonny");
System.out.println(findCommonCharsFor(input));
}
public static Collection<Character> findCommonCharsFor(List<String> strings) {
if (strings == null || strings.isEmpty()) {
return Collections.emptyList();
}
Set<Character> commonChars = convertStringToSetOfChars(strings.get(0));
strings.stream().skip(1).forEach(s -> commonChars.retainAll(convertStringToSetOfChars(s)));
return commonChars;
}
private static Set<Character> convertStringToSetOfChars(String string) {
if (string == null || string.isEmpty()) {
return Collections.emptySet();
}
Set<Character> set = new HashSet<>(string.length() + 10);
for (char c : string.toCharArray()) {
set.add(c);
}
return set;
}
}
上面的代碼打印:
[n, o]

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個(gè)贊
好吧,如果一個(gè)人去散列:
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;
}
這是使用 bucketsort,它給出了 n+m 的復(fù)雜度,但需要 26 個(gè)桶(“散列”數(shù)組)。Imo 在復(fù)雜性方面不能做得更好,因?yàn)槟枰辽俨榭疵總€(gè)字母一次,總和為 n + m。
Insitu 你能得到的最好的結(jié)果是在 O(n log(n) ) 范圍內(nèi)的某個(gè)地方。
你的方法是在 O(n2) 的聯(lián)盟中的某個(gè)地方
插件:如果您需要將字符作為字符串(本質(zhì)上與上面相同,計(jì)數(shù)是返回的字符串的長(zhǎng)度):
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();
}

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
獲取每個(gè)字符串的字符列表:
List<Character> chars1 = s1.chars() // list of chars for first string
.mapToObj(c -> (char) c)
.collect(Collectors.toList());
List<Character> chars2 = s2.chars() // list of chars for second string
.mapToObj(c -> (char) c)
.collect(Collectors.toList());
然后使用retainAll方法:
chars1.retainAll(chars2); // retain in chars1 only the chars that are contained in the chars2 also
System.out.println(chars1.size());
如果您想獲得唯一字符的數(shù)量,只需使用Collectors.toSet()而不是toList()

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個(gè)贊
public static String getCommonCharacters(String... words) {
if (words == null || words.length == 0)
return "";
Set<Character> unique = words[0].chars().mapToObj(ch -> (char)ch).collect(Collectors.toCollection(TreeSet::new));
for (String word : words)
unique.retainAll(word.chars().mapToObj(ch -> (char)ch).collect(Collectors.toSet()));
return unique.stream().map(String::valueOf).collect(Collectors.joining());
}
另一個(gè)不創(chuàng)建臨時(shí)變量Set并使用Character.
public static String getCommonCharacters(String... words) {
if (words == null || words.length == 0)
return "";
int[] arr = new int[26];
boolean[] tmp = new boolean[26];
for (String word : words) {
Arrays.fill(tmp, false);
for (int i = 0; i < word.length(); i++) {
int pos = Character.toLowerCase(word.charAt(i)) - 'a';
if (tmp[pos])
continue;
tmp[pos] = true;
arr[pos]++;
}
}
StringBuilder buf = new StringBuilder(26);
for (int i = 0; i < arr.length; i++)
if (arr[i] == words.length)
buf.append((char)('a' + i));
return buf.toString();
}
演示
System.out.println(getCommonCharacters("abcd", "bcde")); // bcd
添加回答
舉報(bào)