LeetCode最长回文子串解题思路Python JavaScript
Python解题思路
整体解题思路
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。从回文字符串的定义,我们可以发现回文字符串的首字符和尾字符是一定相等的,我们就可以先抓住这一个点,寻找出字符串中所有首尾相等的子串,然后再将其翻转,来比较是否和原始字符串相等,如果相等,那么我们就找到了一个回文字符串,之后将所有的回文字符串都找出来后,我们再比较所有回文字符串的长度,并将最长的回文字符串进行输出。
思路分解
- 设置变量result为输出结果,并赋值为字符串的第一个值,这样如遇到s="c"或s="abcd"这样的最长回文子串为第一个元素的情况,也能正确输出。
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(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解题思路
整体思路
观察回文字符串可以发现其具有轴对称性,即将其左右翻折可以完全重合,那么我们就可以先选定对称点,然后从对称点向左右等距延伸,如果左右元素相同那就一直等距延伸,一直到左右元素不再相同,那么我们就找到了一个回文字符串。
思路分解
- 考虑到最长回文字符串有奇数串也有偶数串,所有分成两种情况进行分析。
- 奇数串时,从第一个元素开始遍历,将第一个元素设定为中心,然后向左右初始减一加一,留意边界问题,比较左右元素是否相同,如果相同,则进行截取,之后和输出结果进行比较,如果新截取的字符串更长则对输出结果进行更新。之后又对左右进行减二加二,以此类推,直到左右元素不相同,然后再选择第二个元素为中心,继续以上循环。
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;
}
}
- 偶数串时,从第一个元素开始遍历,将第一个元素与第二个元素之间的空隙其设定为中心,然后向左右初始减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;
};