假设我有以下字符串对象列表:
ABC1, ABC2, ABC_Whatever
从此列表中提取最常见字符的最有效方法是什么?所以在我的情况下我会得到 ABC 。
答案 0 :(得分:6)
答案 1 :(得分:0)
这对你有用
public static void main(String args[]) {
String commonInFirstTwo=greatestCommon("ABC1","ABC2");
String commonInLastTwo=greatestCommon("ABC2","ABC_Whatever");
System.out.println(greatestCommon(commonInFirstTwo,commonInLastTwo));
}
public static String greatestCommon(String a, String b) {
int minLength = Math.min(a.length(), b.length());
for (int i = 0; i < minLength; i++) {
if (a.charAt(i) != b.charAt(i)) {
return a.substring(0, i);
}
}
return a.substring(0, minLength);
}
答案 2 :(得分:0)
您散列给定列表中单词的所有子字符串并跟踪这些子字符串。具有最大出现次数的那个是您想要的那个。这是一个示例实现。它返回最常见的子字符串
static String mostCommon(List<String> list) {
Map<String, Integer> word2Freq = new HashMap<String, Integer>();
String maxFreqWord = null;
int maxFreq = 0;
for (String word : list) {
for (int i = 0; i < word.length(); ++i) {
String sub = word.substring(0, i + 1);
Integer f = word2Freq.get(sub);
if (f == null) {
f = 0;
}
word2Freq.put(sub, f + 1);
if (f + 1 > maxFreq) {
if (maxFreqWord == null || maxFreqWord.length() < sub.length()) {
maxFreq = f + 1;
maxFreqWord = sub;
}
}
}
}
return maxFreqWord;
}
如果您有多个公共子字符串,则上述实现可能还不够。使用其中的地图。
System.out.println(mostCommon(Arrays.asList("ABC1", "ABC2", "ABC_Whatever")));
System.out.println(mostCommon(Arrays.asList("ABCDEFG1", "ABGG2", "ABC11_Whatever")));
返回
ABC
AB
答案 3 :(得分:0)
您的问题只是找到longest common prefix
的标准问题的重新定义答案 4 :(得分:0)
如果您知道常见字符是什么,那么您可以使用.contains()方法检查其他字符串是否包含这些字符。
答案 5 :(得分:0)
如果您愿意使用第三方库,则以下使用jOOλ为您生成该前缀:
String prefix = Seq.of("ABC1", "ABC2", "ABC_Whatever").commonPrefix();
免责声明:我为jOOλ背后的公司工作
答案 6 :(得分:-1)
如果有N个字符串并且它们中的最小长度是M个承租人,则在最坏情况下(当所有字符串相同时),最有效(正确)的答案将采用N * M.
outer loop - each character of first string at a time
inner loop - each of the strings
test - each charterer of the string in inner
loop against the charterer in outer loop.
如果我们不测试内部循环中的第一个字符串,性能可以调到(N-1)* M