Java字符串集合:最长的通用前缀

Java字符串集合:最长的通用前缀,java,string,prefix,Java,String,Prefix,我得到了一组字符串(目录路径)。 如何获得所有字符串中最长的公共前缀 例如: [“e:/users/test”、“e:/users/test/abc/”、“c:/programs”、“e:/data”、“/test”] 解决方案必须是: [“e:/”、“c:/程序”、“/测试”] 我不知道如何实现这一点 谢谢你的帮助, 问候语既不漂亮也不快速,但似乎有效: public List<String> longestCommonPrefixes(Collection<String&g

我得到了一组字符串(目录路径)。 如何获得所有字符串中最长的公共前缀

例如: [“e:/users/test”、“e:/users/test/abc/”、“c:/programs”、“e:/data”、“/test”]

解决方案必须是: [“e:/”、“c:/程序”、“/测试”]

我不知道如何实现这一点

谢谢你的帮助,
问候语既不漂亮也不快速,但似乎有效:

public List<String> longestCommonPrefixes(Collection<String> c) {
    List<String> list = new ArrayList<>(c);
    List<String> result = new ArrayList<>();
    while (!list.isEmpty()) {
        String lcp = longestCommonPrefix(list);
        result.add(lcp);
        for (Iterator<String> it = list.iterator(); it.hasNext();) {
            if (it.next().startsWith(lcp)) {
                it.remove();
            }
        }
    }
    return result;
}

private String longestCommonPrefix(List<String> list) {
    Map<Character, Integer> map = new HashMap<>();
    for (String s : list) {
        char c = s.charAt(0);
        if (map.containsKey(c)) {
            map.put(c, map.get(c) + 1);
        } else {
            map.put(c, 1);
        }
    }
    char c = 0;
    int max = 0;
    for (Map.Entry<Character, Integer> e : map.entrySet()) {
        int n = e.getValue();
        if (n > max) {
            max = n;
            c = e.getKey();
        } else if (n == max) {
            c = 0;
        }
    }
    if (c == 0) {
        int maxLen = 0;
        String sMaxLen = null;
        for (String s : list) {
            if (s.length() > maxLen) {
                maxLen = s.length();
                sMaxLen = s;
            } else if (s.length() == maxLen) {
                sMaxLen = null;
            }
        }
        return sMaxLen;
    } else {
        String s = null;
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i).charAt(0) == c) {
                s = list.get(i);
                for (int j = i + 1; j < list.size(); j++) {
                    String s2 = list.get(j);
                    if (s2.charAt(0) != c) {
                        continue;
                    }
                    if (s.length() > s2.length()) {
                        s = s.substring(0, s2.length());
                    }
                    for (int k = 0; k < s.length(); k++) {
                        if (s.charAt(k) != s2.charAt(k)) {
                            s = s.substring(0, k);
                            break;
                        }
                    }
                }
                break;
            }
        }
        return s;
    }
}
公共列表最长通用前缀(集合c){
列表=新的ArrayList(c);
列表结果=新建ArrayList();
而(!list.isEmpty()){
字符串lcp=最长的公共前缀(列表);
结果:添加(lcp);
for(Iterator it=list.Iterator();it.hasNext();){
if(it.next().startsWith(lcp)){
it.remove();
}
}
}
返回结果;
}
私有字符串longestCommonPrefix(列表){
Map Map=newhashmap();
用于(字符串s:列表){
字符c=s.charAt(0);
if(图c){
map.put(c,map.get(c)+1);
}否则{
图.put(c,1);
}
}
字符c=0;
int max=0;
对于(Map.Entry e:Map.entrySet()){
int n=e.getValue();
如果(n>最大值){
max=n;
c=e.getKey();
}else如果(n==最大值){
c=0;
}
}
如果(c==0){
int maxLen=0;
字符串sMaxLen=null;
用于(字符串s:列表){
如果(s.length()>maxLen){
maxLen=s.长度();
sMaxLen=s;
}如果(s.length()==maxLen),则为else{
sMaxLen=null;
}
}
返回斯马克斯伦;
}否则{
字符串s=null;
对于(int i=0;is2.length()){
s=s.substring(0,s2.length());
}
对于(int k=0;k
制作一个字符串数组。探索。编写一些代码。所有这些字符串中最长的公共前缀是“”。第一个查找,它是最常见的第一个字符。然后只需检查以下字符是否匹配,如果匹配,则添加它们。然后对那些不是以最普通的开始的做同样的事情。。。然后继续下去,直到没有任何条件为止。@FlorianZinnecker是的,我的。对不起,我不能接受你的解释。