Python 求问一道算法题,最长公共前缀

测试新人 · 2023年11月09日 · 最后由 nine9sky 回复于 2024年01月28日 · 4794 次阅读

题目:https://leetcode.cn/problems/longest-common-prefix/description/?envType=study-plan-v2&envId=top-interview-150

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:


        if not strs: return ""
        str0 = min(strs)
        str1 = max(strs)
        for i in range(len(str0)):
            if str0[i] != str1[i]:
                return str0[:i]
        return str0

求问为什么这种写法可以通过?

看作者的想法好像是想找出最长和最短的两个字符,通过找到是否存在公前缀的骚方法去判断全部字符,不过这种解法会存在一个漏洞就是当 strs=["flower","flow","flight"],找出来的最长会是 flower。而且找最长和最短字符应该是这样写 “min(strs,key=len)”,直接 min 和 max 比较的是字符对应的 ASCII 码。

但是目前很骚的是,这样写居然通过了全部测试,当用例是 strs=["flower","flow","flight"] 时,min(strs) 是等于 “flight” 避开了这个用例,,,,,,看不懂。求下大佬解释下这解法的意思,看晕了😂

共收到 17 条回复 时间 点赞

可以转化拿下 ascii 码看看三个字符的顺序,ASCII 码的比对是依次进行的,最小的前缀必然是所有用例共有的,只是在某个点位的字符小于其他用例的该点位字符,在循环获取到该位置后即可进行截取了

那他这里的 min 和 max 目的是什么😂

就是为了取出最大最小值啊
最大是拥有最长共有前缀或者异位处最靠后的
最小是拥有最短共有前缀 and 异位处最靠前的

费脑子不喜欢动脑子,不刷算法,点点点就完事了

但是这里它是取出 ASCII 码最大和最小的字符,感觉没啥关联呀

测试新人 回复

你去了解下 ASCII 码就知道了,最长公共前缀必然是由最小字符来决定的,当第 N 位字符是非公共时,[:N] 位前缀必然是最小字符也拥有的,而 “最小” 也意味着 “最长”,你能读懂的话就懂了,不懂的话就去转换下 strs=["flower","flow","flight"] 看看他们的 ASCII 码是怎样的

8楼 已删除

找的不是最长字符,max 和 min 是为了找到多个字符串两个第一个不同的字符,如果均相同,min 才会找到最短的,

字符串按照字母的 ASCII 码进行比较时,较小的字符排在前面。因此,字符串列表中的最小值是按照字母顺序最靠前的字符串,最大值是按照字母顺序最靠后的字符串。

考虑到最长公共前缀的定义,它是一组字符串中所有字符串的共同的前缀部分。如果最小值和最大值有一个公共前缀,那么由于最小值的字符顺序在最大值之前,该公共前缀必定出现在整个列表中的其他字符串的前部分。

假设最小值和最大值的最长公共前缀是 “prefix”,则对于列表中的任意字符串,它的前缀只会比 “prefix” 短或者相等,而不会比 “prefix” 更长,因为最大值比最小值的字符顺序晚。这就意味着 “prefix” 是整个列表中的最长公共前缀。

因此,根据字符串按 ASCII 码比较的性质,最小值和最大值的最长公共前缀必然是整个列表中的最长公共前缀。这也是这段代码可以正确判断最长公共前缀的原因。

懂了

测试新人 回复

啊?嗯。对对对,是的,我就是这么想的😁

点就完事了

这种题解好像对你学习算法没什么帮助,大可不看

槽神 回复

我是刚好看答案时找到这个解法,看不明白😂 ,现在想通了

这种题目对于转码的意义不大,可以刷一些数据结构的题目,然后 dfs bfs 回溯 动态规划之类的

nine9sky 回复

我知道,只是他这个解法有点骚,忍不住想看下😂

测试新人 回复

这是正常解法,我 c 语言刷这道题也是用 qsort 将字符串按字母表排序,后面逻辑一样。

nine9sky 回复

阿。。。。这算正常的吗? 正确场景下的要么是暴力破解,要么扫描 要么分治 要么二分查找,能第一时间想到用 ASCII 码来比较的,感觉都是思维很跳跃的😂

测试新人 回复

二分查找的前提就是排序,你都排好序了,这个就是一点点小的 tips,第一个和最后一个公共子串比较是巧妙的点。 ascii 码只是描述内存内容的一种表现方式, 我觉得你可以看看 leetcode 49 group anagram。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册