新手村练习--巧解leetcode

93 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情


给你一个字符串 s,找到 s 中最长的回文子串。

 

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:

输入:s = "cbbd"
输出:"bb"

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 试了按流程解和找规律分类讨论解法,第一种解法易于理解,有空细说第二种解法

  • 将Z的一个横线和斜线看成一组,总个数为(2*numsRows-2)。在整体的结果中,每一行的元素在原字符串中的下标取余,值依次为0/1(5)/2(4)/3,由此根据数学规律,可依次添加到StringBuffer中,然后输出

  • 开始题都没有看懂,怎么都没看出来Z字形变换,后面搜索了一下,才明白是从左边第一列往下写Z,然后再往上折回,再往下,反复写Z。 解题辅助:自己画了一个表格,没有写字母,用的数字,这样子和角标对应起来,看的比较方便。我是找的规律解决的这道题,除了第一行和最后一行,每组是一个,其他行都是每组两个,然后先记录第一个,再找出规律纪录同一组里面的第二个,这个时候要注意判断是不是超出数组范围了,就可以。有一个图片,大家看着就很清楚了。

  • 从长到短遍历字符串中的每一种可能字符串,并判断其是否为回文,如果是就立即返回,回文的判断思路很简单,就是从字符串两头开始对比,如果出现不相等的字符串,那就说明不是回文,长度不分奇偶。

  • 中心扩散法 循环遍历 整个字符数组,然后比对点位置从头移动到尾 以比对点为中心往两边扩散 直到找到最大回文串

动态规划

  • 第一步要找出状态转换式,这个找到了就方便写,而我就没找到,所以这个要背写来,即使可能写过好几次这题了。然后思路比较清晰,但在实现上有一些细节,比如中心拓展法的函数expand_from_center的返回值,由于最后执行了left--和right++,所以此时中心拓展的回文长度为left - right - 1, 而我写了很久的 left - right + 1;至于那两个三元运算符,只是抖机灵而已,可能方便多线程优化吧。