编写一个函数来查找字符串数组中的最长公共前缀。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(); }