編寫一個函數來查找字符串數組中的最長公共前綴。java
若是不存在公共前綴,返回空字符串 ""。 算法
示例 1: 輸入: ["flower","flow","flight"] 輸出: "fl" 示例 2: 輸入: ["dog","racecar","car"] 輸出: "" 解釋: 輸入不存在公共前綴數組
說明: 全部輸入只包含小寫字母 a-z 。app
每次取2個字符串,得到公共前綴。而後把公共前綴再次當作新的字符串放入數組,進行比較。直到數組中只剩下一個字符串時,該字符串就是最長公共前綴。函數
public String longestCommonPrefix(String[] strs) { if (strs.length == 0) { return ""; } if (strs.length == 1) { return strs[0]; } // 此處爲了方便,使用了LinkedList LinkedList<String> linkedList = new LinkedList<>(); for (String str : strs) { linkedList.addFirst(str); } return longestCommonPrefix(linkedList); } private String longestCommonPrefix(LinkedList<String> linkedList) { while (linkedList.size() > 1) { // 取出2個字符串 String s1 = linkedList.removeFirst(); String s2 = linkedList.removeFirst(); // 獲取公共前綴 StringBuilder commonPrefix = new StringBuilder(); for (int i = 0; i < s1.length() && i < s2.length(); i++) { if (s1.charAt(i) == s2.charAt(i)) { commonPrefix.append(s1.charAt(i)); } else { break; } } // 公共前綴加入數組 linkedList.addLast(commonPrefix.toString()); } return linkedList.get(0); }
該方法的時間複雜度是(O2), 雖然比暴利破解O(n3)的解法好,可是依舊不夠完美。ui
將字符串排序,而後取第一個字符串和最後一個字符串的公共前綴便可。(排序算法直接使用庫函數,得到最優的排序時間複雜度)code
public String longestCommonPrefix(String[] strs) { if (strs.length == 0) { return ""; } if (strs.length == 1) { return strs[0]; } // 排序 Arrays.sort(strs); String s1 = strs[0]; String s2 = strs[strs.length - 1]; StringBuilder commonPrefix = new StringBuilder(); for (int i = 0; i < s1.length() && i < s2.length(); i++) { if (s1.charAt(i) == s2.charAt(i)) { commonPrefix.append(s1.charAt(i)); } else { break; } } return commonPrefix.toString(); }