首页 > 其他分享 >leetcode 14. 最长公共前缀 (绝对想不到的解法)

leetcode 14. 最长公共前缀 (绝对想不到的解法)

时间:2022-10-27 20:02:04浏览次数:53  
标签:tmp 前缀 zip strs res len 字符串 leetcode 14


题目在这:https://leetcode-cn.com/problems/longest-common-prefix/

先说一下传统的解法,毕竟刷leecode是为了提升算法能力,直接用函数不太可取哈哈.
题目要找最长公共前缀,是前缀~~~差点看错找公共子序列了 我dp都建好了(狗头)

要点:
任何字符串和空字符都是没有公共字符的,也就是说我们只需要找最短的字符串拿出来比较就行了。
比如 str = [‘abc’,‘ab’,‘a’] 显然我们只需要拿最短的字符串 ‘a’ 和其他的两个字符串第一位比看是不是a就可以了。

上代码!

strs = ["dog","racecar","car"]
lenght = len(strs[0])
for i in range(len(strs)): # 先找出来最短的那个字符串
if len(strs[i]) < lenght:
lenght = len(strs[i])
temp = True
res = 0
for i in range(lenght):
for j in range(len(strs)-1):
if strs[j][i] != strs[j+1][i]:
temp = False
if temp:
res += 1 # 统计有多少位是一样的
st = ''
if res:
for i in range(res): # 循环遍历res 吧相同的字母放到st里
st += strs[0][i] # 这样st里就是存的公共前缀了
print(st)
else:
print(' ')

里面的两层循环要想好,比较容易错,反正我就在这错了哈哈。
外层循环是控制字符串当前比较的第几位,而里面的for用来转移到一下字符串。拿代码模拟一遍就理解了…

绝妙解法:

要点:

1.python里的zip()函数 :用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组。
2.set()变成集合,可以做到除重的效果.
3.*str 解压参数 拆包…
比如:

strs = ["flower","flow","flight"]
当我们使用 *strs之后 变成....
flower flow flight
------------------------------------
for i in zip(*strs)
则 i 输出为:
('f', 'f', 'f')
('l', 'l', 'l')
('o', 'o', 'i')
('w', 'w', 'g')

zip将每个字符串的每一位一一对应起来.
空字符不算,应该是zip的特性,可以参考https://www.runoob.com/python/python-func-zip.html
这时候使用set()的特性—去重。
去重之后如果只有一个字母--------所有字符串中相同位都是同样的字母
去重之后如果包含一个以上的字母-------字母有所不同

完整代码:

strs = ["flower","flow","flight"]
res = ""
for tmp in zip(*strs):
print(tmp)
tmp_set = set(tmp)
if len(tmp_set) == 1:
res += tmp[0]
else:
break
print(res)

这段代码是在leetcod评论区看到的,看完之后惊到了。
也是自己对python语法理解不够深刻,属实想不到。

不过大家还是要着重理解普通的算法解法,毕竟还要面试啥的…

--------------一个小白的刷题笔记


标签:tmp,前缀,zip,strs,res,len,字符串,leetcode,14
From: https://blog.51cto.com/u_15849381/5801754

相关文章

  • 力扣(leetcode) 1. 两数之和(暴力枚举) (哈希表)
    题目在这:https://leetcode-cn.com/problems/two-sum/nums=[2,7,11,15]target=9这题还是比较容易想到的,题目要求在nums数组里找俩不同位置的数他们相加等于给的target......
  • leetcode 20. 有效的括号(栈的解法)
    题目在这:https://leetcode-cn.com/problems/valid-parentheses/括号匹配问题,立马想到用栈去做.遇到左括号进栈,遇到右括号匹配当前栈顶,相同就把栈顶的元素弹出,不同直接返回F......
  • 力扣(leetcode) 1035. 不相交的线 (公共子序列)(动态规划)
    题目在这:https://leetcode-cn.com/problems/uncrossed-lines/这道题就是考一个公共子序列的问题,不过这种算法对于我这种小白来说还是难,毕竟leetcode上第一次刷到动态规划......
  • 力扣(leetcode) 12. 整数转罗马数字 (哈希映射表解法)、(暴力匹配)
    题目:https://leetcode-cn.com/problems/integer-to-roman/题目很好理解,并且容易想到解法。题目要求输入范围是1-3999可以理解为在每一位上找到相应的罗马数字表示即可比如......
  • 力扣(leetcode) 692. 前K个高频单词
    题目:https://leetcode-cn.com/problems/top-k-frequent-words/这个题用python解起来还是挺简单的,用字典就行了。key存单词value存出现的次数dic={}res=[]foriinr......
  • Leetcode908思路
    为什么写这篇文章?相信不少人在看官方的leetcode题解的时候,都遇到了不少困难。leetcode官方的题解,省略了不少细节。导致在读的时候非常难懂。所以,我在这里写出我对官方答案......
  • uva 1428
    题目求三元组(i,j,k),i<j<k,满足a[i]<a[j]<a[k],有多少组?(a[i]<=1e5)枚举j,考虑a[i]<a[j]有多少i满足这个条件注意到a[i]的范围,我们用一个桶v[i]存以下......
  • uva 1401 字典树模板
    给一个串和一个字典(一些字符串)将这个串分解为字典单词的连接(如abcd=ab+cd=a+bcd)问有多少方案线性dp枚举位置if[i]+=f[j]i<j,string(i,j)为字典单词直接......
  • Leetcode第1822题:数组元素积的符号(Sign of product of an array)
    解题思路一个数组所有元素的乘积为正返回1,为零返回0,为负返回-1.变量pos统计正元素的个数,变量neg统计负元素的个数,遍历数组。遍历过程中如果有元素为零,直接返回0;遍历结束......
  • #yyds干货盘点# LeetCode 腾讯精选练习 50 题:全排列
    题目:给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。 示例1:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2]......