• Longest Common Prefix


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

    这是一道字符串的简单题.思路也非常简单,基本都是brute force的解法.具体解法分为:按列扫和按行扫两种.

    按列扫,是每次从第一个字符串中取一个出来,比较其余所有字符串响应位置字符是否相同,不相同则退出.返回第一个字符串的子串.

    按行扫,是每个拿一个字符串去和第一个字符串比较,获得当前相同子串的长度.之后每个字符串跟其相比时,都不超过当前这个子串的长度.

    两种解法的时间复杂度都是O(n1+n2+n3+n4...),空间复杂度为O(1).

    使用python解这种题目时有非常多的trick.合理使用可以提速很多.

    按行扫不使用trick版本,运行时间60ms.比较慢.

    class Solution(object):
        def longestCommonPrefix(self, strs):
            """
            :type strs: List[str]
            :rtype: str
            """
            if not strs:
                return ""
         
            for j in range(len(strs[0])):
               for i in range(1,len(strs)):
                    if j >= len(strs[i]) or strs[i][j] !=strs[0][j]:
                        return strs[0][:j]
            return strs[0]
               

    按行扫使用trick版本,运行时间48ms,使用zip来实现.zip实际是将行字符串做了按列的一个排列,且处理到最短的序列长度.但是引入了O(n1+n2+n3+..)的空间复杂度,所以实际是以空间换时间.数据量大时不建议用.

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

    按列扫方法,我没有具体实现,贴上别人实现的C++版本:

    class Solution {
    public:
    string longestCommonPrefix(vector<string> &strs) {
        if (strs.empty()) return "";
        int right_most = strs[0].size() - 1;
        for (size_t i = 1; i < strs.size(); i++)
            for (int j = 0; j <= right_most; j++)
                if (strs[i][j] != strs[0][j]) // 不会越界,请参考 string::[] 的文档
                    right_most = j - 1;
        return strs[0].substr(0, right_most + 1);
      }
    };
  • 相关阅读:
    元素对应赋值与列表生成器
    python装饰器
    python之闭包
    内置函数,重要的四个reduce,map,lambda,filter
    高阶函数,递归函数,内置函数
    函数作用域
    python函数
    集合
    python深浅拷贝以及数据在内存中储存方法
    Linux之ubuntu系统操作学习笔记
  • 原文地址:https://www.cnblogs.com/sherylwang/p/5434033.html
Copyright © 2020-2023  润新知