最长回文子串算法中lambda、key参数及currentLongest作用疑问
最长回文子串代码逻辑解答
注:原代码存在拼写笔误:
even = getLongestPalidromeFrom(应为getLongestPalindromeFrom,否则运行会报函数不存在错误。
1. 初始化currentLongest = [0, 1]的作用
不是仅用来存储两个值,这个列表固定存储当前找到的最长回文子串的切片索引,严格遵循Python左闭右开的切片规则:[0, 1]对应的切片是string[0:1],也就是字符串的第一个字符,符合题目「单字符默认是回文」的初始条件,作为全局最长回文的初始基准值。
2. 变量odd、even的返回值是否为索引数组
是的,两个变量接收的都是和currentLongest格式完全一致的索引数组:
odd对应以当前下标i为中心的、长度为奇数的最长回文子串的左右索引even对应以当前下标i和i-1为中心的、长度为偶数的最长回文子串的左右索引
3. max函数中key参数的lambda x: x[1] - x[0]逻辑
Python内置max函数的key参数作用是指定比较规则:不会直接比较传入的元素本身,而是先把每个元素传入key对应的函数,用函数返回的结果做大小比较。
这里的lambda表达式逻辑是计算索引数组对应的回文子串长度:因为切片长度等于右索引减左索引,x[1]-x[0]的结果就是当前索引组对应的子串长度,max会自动选出长度最长的那个索引组。
4. 比较longest和currentLongest的目的、比较规则
- 目的:
longest是当前下标i能扩展出的最长回文索引组,每次循环都要和全局存储的currentLongest做对比,更新全局最长回文的索引。 - 比较规则:因为传入了key参数,不会用Python默认的列表逐元素对比规则,只会按两个索引组对应的子串长度做对比,最终返回长度更大的索引组。
5. 索引存储+max+lambda的组合用法说明
这套写法是为了简化逻辑、减少冗余操作:
- 用索引数组存储回文位置,不需要每次计算都切割生成子串,只需要在最终返回的时候切割一次,节省内存和字符串操作的开销
- max配合lambda的写法,替代了手动写多分支if判断长度的逻辑:比如不需要写
if (longest[1]-longest[0]) > (currentLongest[1]-currentLongest[0])这种冗余代码,一行就能完成最长项的筛选,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Adilson Jurado
相关产品推荐
相关产品推荐

