LeetCode 14. Longest Common Prefix

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

 

 

posted @ 2022-02-04 23:30  zeroingToOne  阅读(37)  评论(0编辑  收藏  举报