2015-03-31 52 views
-3

我收到了String(目錄路徑)的集合。 如何獲得所有字符串的最長公共前綴?Java String-Collection:最長的公共前綴

實施例: [ 「E:/用戶/測試」, 「E:/用戶/測試/ ABC /」, 「C:/方案」, 「E:/數據」, 「/測試」]

該解決方案必須比: [ 「E:/」, 「C:/程序」, 「/測試」]

我不知道如何實現這...

感謝你的幫助, 問候

+0

創建一個字符串數組。瀏覽http://docs.oracle.com/javase/7/docs/api/java/lang/String.html。寫一些代碼。 – Touchstone 2015-03-31 10:20:57

+3

所有這些字符串中最長的公共前綴是「」。 – 2015-03-31 10:21:08

+0

首先看哪個是最常見的第一個字符。然後檢查下列字符是否匹配,如果匹配,則添加它們。然後對沒有以最常見的那個開始的那些做同樣的事情......並且繼續下去,直到沒有Strings離開。 – Bubletan 2015-03-31 10:39:51

回答

0

既不漂亮也不快,但似乎工作:

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; 
    } 
}