https://leetcode-cn.com/problems/longest-common-prefix/

代码:

# -*- coding:utf-8 -*-

class Solution(object):
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if len(strs) == 0 or '' in strs:
            return ''
        if len(strs) == 1:
            return strs[0]
        res = ''
        min_len = len(strs[0])
        for i in range(1, len(strs)):
            if len(strs[i]) < min_len:
                min_len = len(strs[i])
        i = 0
        while True:
            if i < min_len:
                temp_str = strs[0][i]
            else:
                return res
            temp_flag = True
            for j in range(1, len(strs)):
                if strs[j][i] != temp_str:
                    temp_flag = False
            if temp_flag == False:
                return res
            else:
                res += temp_str
                i += 1
if __name__ == '__main__':
    strs = ["cc", 'ccc']
    print(Solution().longestCommonPrefix(strs))

思路:首先就是异常数据的处理,不得不说这方面我还是太弱了,基本都靠报错加异常情况 唉。首先是找出这些字符串中的最短字符串长度,然后依次遍历n个字符串,如果这一趟中字符都相等,则将这个字符添加到结果字符串中,否则直接返回res字符串。

思考:这道题,我做的时候就觉得我做的麻烦了,做完看了下评论还真是,又一个用ascii码比较的,首先说一下什么是ascii码比较。

比如 abb, aba,abac ,首先比较a,都一样,然后比较b 都一样,然后比较b,a,a,这时候显然b的ascii大于a的ascii,因此这三个字符串的最大值为abb,最小值为aba。因此我们只需比较这两个字符串前n个匹配返回即可。

def longestCommonPrefix(self, strs):
        if not strs: return ""
        s1 = min(strs)
        s2 = max(strs)
        for i,x in enumerate(s1):
            if x != s2[i]:
                return s2[:i]
        return s1

但是这个方法只是“巧”,从运行时间上来说,并不比上面的看起来冗长的方法快。

分类: 算法

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注