zoukankan      html  css  js  c++  java
  • 14. Longest Common Prefix

    题目:

    Write a function to find the longest common prefix string amongst an array of strings.

    链接:http://leetcode.com/problems/longest-common-prefix/

    题解:

    求最长前缀。按列计算,判断条件是当前列字符是否相同,以及当前行的长度是否有效。

    Time Complexity - O(n), Space Complexity - O(1)。

    public class Solution {
        public String longestCommonPrefix(String[] strs) {
            if(strs == null || strs.length == 0)
                return "";
            
            for(int j = 0; j < strs[0].length(); j ++)                  // calc in each row
                for(int i = 1; i < strs.length; i ++)                   // calc in each column
                    if(j == strs[i].length() || strs[0].charAt(j) != strs[i].charAt(j))
                        return  strs[0].substring(0, j);
                        
            return strs[0];
        }
    }

    二刷:

    Java:

    Time Complexity - O(mn),  Space Complexity - O(1)

    以第一行为基准行,按列比较字符,假如遇到长度更小,或者字符不一样,返回基本行的substring(0, j)

    public class Solution {
        public String longestCommonPrefix(String[] strs) {
            if (strs == null || strs.length == 0) {
                return "";
            }
            for (int j = 0; j < strs[0].length(); j++) {
                for (int i = 1; i < strs.length; i++) {
                    if (j >= strs[i].length() || strs[i].charAt(j) != strs[0].charAt(j)) {
                        return strs[0].substring(0, j);
                    }
                }
            }
            
            return strs[0];
        }
    }

    也有利用java String.indexOf的方法,虽然时间复杂度一样,但实际运行起来很快。

    Time Complexity - O(mn), Space Complexity - O(n)。

    public class Solution {
        public String longestCommonPrefix(String[] strs) {
            if (strs == null || strs.length == 0) {
                return "";
            }
            String prev = strs[0];
            for (int i = 1; i < strs.length; i++) {
                while (strs[i].indexOf(prev) != 0) {
                    prev = prev.substring(0, prev.length() - 1);
                }
            }
            
            return prev;
        }
    }

    Python:

    应该是一个很好的练习zip()的地方。下面代码主要来自zcjsword。 先用'*' uppack strs里的strs里的strings,使用zip截取统一的长度,再按行利用unpacked list建立set,假如set中的元素大于1,说明在过程中出现了不match的情况,我们可以返回结果。

    class Solution(object):
        def longestCommonPrefix(self, strs):
            """
            :type strs: List[str]
            :rtype: str
            """
            if not strs:
                return ""
            sz, res = zip(*strs), ""
            for c in sz:
                if len(set(c)) > 1:
                    break
                res += c[0]
            return res    

    三刷:

    Java:

    public class Solution {
        public String longestCommonPrefix(String[] strs) {
            if (strs == null || strs.length == 0) return "";
            
            for (int j = 0; j < strs[0].length(); j++) {
                for (int i = 1; i < strs.length; i++) {
                    if (j == strs[i].length() || strs[i].charAt(j) != strs[0].charAt(j)) return strs[0].substring(0, j);
                }
            }
            return strs[0];
        }
    }

    Reference:

    https://leetcode.com/discuss/20993/java-code-with-13-lines

    https://leetcode.com/discuss/63950/5-line-python-with-zip-and-len-set

  • 相关阅读:
    Redis单实例数据迁移到集群
    使用IDEA快速搭建基于Maven的SpringBoot项目(集成使用Redis)
    Linux下Mysql每天自动备份
    java调用webservice
    springmvc后台生成验证码
    Zabbix 监控端口状态并邮件报警
    Zabbix 通过smtp 邮件报警
    Zabbix安装(server和agent)及基本配置
    Spark之 Spark Streaming整合kafka(Java实现版本)
    openlayer 5 获取中心点
  • 原文地址:https://www.cnblogs.com/yrbbest/p/4431164.html
Copyright © 2011-2022 走看看