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

     

  • 相关阅读:
    AttributeError: '_csv.reader' object has no attribute 'next'
    AttributeError: type object '_io.StringIO' has no attribute 'StringIO'
    sklearn学习笔记2
    sklearn学习笔记1
    隐语义模型LFM(latent factor model)
    windows下python3.4安装scikit-learn
    关联规则1
    关联规则
    Jmeter上传文件
    jmeter 学习笔记
  • 原文地址:https://www.cnblogs.com/zeroingToOne/p/7809434.html
Copyright © 2020-2023  润新知