LeetCode最长回文子串解题思路Python JavaScript

Python解题思路

整体解题思路

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。从回文字符串的定义,我们可以发现回文字符串的首字符和尾字符是一定相等的,我们就可以先抓住这一个点,寻找出字符串中所有首尾相等的子串,然后再将其翻转,来比较是否和原始字符串相等,如果相等,那么我们就找到了一个回文字符串,之后将所有的回文字符串都找出来后,我们再比较所有回文字符串的长度,并将最长的回文字符串进行输出。

思路分解

  1. 设置变量result为输出结果,并赋值为字符串的第一个值,这样如遇到s="c"或s="abcd"这样的最长回文子串为第一个元素的情况,也能正确输出。
result = s[0]##用于存储最长回文子串
  1. 先寻找出首尾元素相同的子字符串,考虑到首尾相同的特性,使用两个循环,一个从头开始,一个从尾开始,可以减少一部分比较的次数。
for index in range(len(s)):##第一个循环,从头开始,固定元素
    num=len(s)-1
    while(num>index):##第二个循环,从尾开始,找寻和s(index)相等的元素
        if(s[index]==s[num]):
  1. 寻找到首尾相同的子字符串之后,将该字符串进行翻转,然后比较两个字符串是否相同,如相同,则为回文字符串。
temstr1=s[index:num+1]##找到相等的元素后将两个相等元素之间的所有元素进行截取
temstr2=temstr1[::-1]##对截取的字符串进行翻转
if(temstr1==temstr2):##判断是否是回文字符串
  1. 找到回文字符串后,和之前找到的进行比较,来判断新的回文字符串是否是更长的一个,如是则更新结果。
if(len(Palindrome)==0):##如果没有找到回文字符串,则s的第一个元素就是回文字符串
    return s[0]
Maxnum = len(Palindrome[0])##先将列表中的第一个元素的长度设为最大值
result = 0##最后输出结果的下标
for index in range(len(Palindrome)):##遍历所有元素,有比Maxnum大的则更新Maxnum和result
    if Maxnum < len(Palindrome[index]):
        Maxnum = len(Palindrome[index])
        result = index
return Palindrome[result]

源代码

class Solution:
    def longestPalindrome(self, s: str) -> str:
        result = s[0]##用于存储最长回文子串
        for index in range(len(s)):##第一个循环,从头开始,固定元素
            num=len(s)-1
            while(num>index):##第二个循环,从尾开始,找寻和s(index)相等的元素
                if(s[index]==s[num]):
                    temstr1=s[index:num+1]##找到相等的元素后将两个相等元素之间的所有元素进行截取
                    temstr2=temstr1[::-1]##对截取的字符串进行翻转
                    if(temstr1==temstr2):##判断是否是回文字符串
                        if(len(result)<=len(temstr1)):##判断新的回文字符串是否更长
                            result=temstr1
                num=num-1
        return result

JavaScript解题思路

整体思路

观察回文字符串可以发现其具有轴对称性,即将其左右翻折可以完全重合,那么我们就可以先选定对称点,然后从对称点向左右等距延伸,如果左右元素相同那就一直等距延伸,一直到左右元素不再相同,那么我们就找到了一个回文字符串。

思路分解

  1. 考虑到最长回文字符串有奇数串也有偶数串,所有分成两种情况进行分析。
  2. 奇数串时,从第一个元素开始遍历,将第一个元素设定为中心,然后向左右初始减一加一,留意边界问题,比较左右元素是否相同,如果相同,则进行截取,之后和输出结果进行比较,如果新截取的字符串更长则对输出结果进行更新。之后又对左右进行减二加二,以此类推,直到左右元素不相同,然后再选择第二个元素为中心,继续以上循环。
var result = s[0];//设置输出结果
    for (var index = 0; index < s.length; index++) {//最长回文串是奇数串的情况
        var i = 1;//初始延伸距离
        while (index >= i && index + i < s.length) {//设置边界
            if (s[index - i] == s[index + i]) {//进行延伸元素比较
                var temresult = s.slice(index - i, index + i + 1);//字符串的截取
                if (temresult.length > result.length) {//与原始输出结果进行比较
                    result = temresult;
                }
                i++;
            } else break;
        }
    }
  1. 偶数串时,从第一个元素开始遍历,将第一个元素与第二个元素之间的空隙其设定为中心,然后向左右初始减0加0,留意边界问题,比较左右元素是否相同,如果相同,则进行截取,之后和输出结果进行比较,如果新截取的字符串更长则对输出结果进行更新。之后又对左右进行减一加一,以此类推,直到左右元素不相同,然后再选择第二个元素和第三个元素之间的空隙为中心,继续以上循环。
for (var index = 0; index < s.length; index++){//最长回文串是偶数串的情况
        var i = 0;//初始延伸距离
        while (index >= i && index + i < s.length) {//设置边界
            if (s[index - i] == s[index + i + 1]) {//进行延伸元素比较
                var temresult = s.slice(index - i, index + i + 2);//字符串的截取
                if (temresult.length > result.length) {//与原始输出结果进行比较
                    result = temresult;
                }
                i++;
            } else break;
        }
    }

源代码

var longestPalindrome = function (s) {
    var result = s[0];//设置输出结果
    for (var index = 0; index < s.length; index++) {//最长回文串是奇数串的情况
        var i = 1;//初始延伸距离
        while (index >= i && index + i < s.length) {//设置边界
            if (s[index - i] == s[index + i]) {//进行延伸元素比较
                var temresult = s.slice(index - i, index + i + 1);//字符串的截取
                if (temresult.length > result.length) {//与原始输出结果进行比较
                    result = temresult;
                }
                i++;
            } else break;
        }
    }
    for (var index = 0; index < s.length; index++){//最长回文串是偶数串的情况
        var i = 0;//初始延伸距离
        while (index >= i && index + i < s.length) {//设置边界
            if (s[index - i] == s[index + i + 1]) {//进行延伸元素比较
                var temresult = s.slice(index - i, index + i + 2);//字符串的截取
                if (temresult.length > result.length) {//与原始输出结果进行比较
                    result = temresult;
                }
                i++;
            } else break;
        }
    }
    return result;
};
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值