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

     

  • 相关阅读:
    百度富文本编辑器的上传图片的路径问题
    laravel初次学习总结及一些细节
    macOS apache配置及开启虚拟服务器的开启,apache开启重写模式
    类似于qq空间类型的评论和回复
    向php提交数据及json
    mac 初次配置apache,及mac下安装mysql
    C#连接mysql数据库插入数据后获取自增长主键ID值
    PHP 真正多线程的使用
    C# 连接mysql数据库
    MySql状态查看方法 MySql如何查看连接数和状态?
  • 原文地址:https://www.cnblogs.com/zeroingToOne/p/7809434.html
Copyright © 2020-2023  润新知