Write a function to find the longest common prefix string amongst an array of strings.
对给定的String类型的数组,要求写一个方法返回数组中字符串的最长公共前缀。
解法一:将数组中第一个字符串假定为公共前缀,从前往后遍历数组,如果当前字符串不是以当前前缀开始,则将当前前缀去掉最后一个字母,再接着判断;如果是以当前前缀开始,则判断下一个字符串。代码如下:
public String longestCommonPrefix(String[] strs){ if(strs == null || strs.length == 0) return ""; String pre = strs[0]; for(int i = 1; i < strs.length; i++){ while(!strs[i].startsWith(pre)){ pre = pre.substring(0, pre.length() - 1); if(pre.isEmpty()) //判断pre是否已经变成空字符串 return ""; } } return pre; }
解法二:采用纵向逐列遍历。将单词上下排好,相当于一个各行长度有可能不相等的二维数组。取数组中第一个字符串的第一个字母给前缀,然后遍历数组中其他字符串上对应位置的字母是否相等,如果相等,则将该字母存入公共前缀结果,继续检查下一个字母;否则返回当前前缀。此外,在遍历过程中,如果某个字符串没有后续字母了,则说明其为最短前缀。代码如下:
public String longestCommonPrefixThree(String[] strs){ if(strs == null || strs.length == 0) return ""; char ch; String pre = ""; for(int i =0; i < strs[0].length(); i++){ ch = strs[0].charAt(i); for(int j = 1; j < strs.length; j++){ if(i >= strs[j].length() || ch != strs[j].charAt(i)) return pre; } pre = pre.concat(String.valueOf(ch)); } return pre; }
解法三:分治法。将字符串数组,分为左右两个子数组,先求左字符串数组的前缀,再求右字符串数组的前缀,再求两个前缀的前缀。许多字符串的前缀不好求,两个字符串的前缀肯定好求。
class Solution { public String longestCommonPrefix(String[] strs) { return getPrefix(strs, 0, strs.length - 1); } public String getPrefix(String[] strs, int low, int high) { // 子数组只有一个字符串,那它本身就是最长前缀 if (low == high) { return strs[low]; } // 分为两个子数组 int mid = low + (high - low) / 2; // 求左数组的最长前缀 String leftPrefix = getPrefix(strs, low, mid); // 求右数组的最长前缀 String rightPrefix = getPrefix(strs, mid + 1, high); // 求两个最长前缀的最长前缀 int length = Math.min(leftPrefix.length(), rightPrefix.length()); for (int i = 0; i < length; i++) { if (leftPrefix.charAt(i) != rightPrefix.charAt(i)) { return leftPrefix.substring(0, i); } } return leftPrefix.substring(0, length); } }