题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:”bab”
解释:”aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:”bb”
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| func longestPalindrome(s string) string { maxstr := "" for i := 0;i < len(s);i++{ pr,re := i-1,i+1 str := string(s[i]) for pr >= 0 && re < len(s) && s[pr] == s[re]{ str = string(s[pr]) + str + string(s[re]) pr-- re++ } if len(str) > len(maxstr){ maxstr = str }
if(i+1 < len(s) && s[i]==s[i+1]){ pr,re := i,i+1 str := string(s[pr]) + string(s[re]) for pr >= 0 && re < len(s) && s[pr] == s[re]{ if pr != i{ str = string(s[pr]) + str + string(s[re]) } pr-- re++ } if len(str) > len(maxstr){ maxstr = str } } } return maxstr }
|
思路:中心扩散法,类似于双指针遍历,不过是反向的。特别的,这里要考虑两种情况:回文串为奇数的时候以及回文串为偶数的时候。
解题思路
题目要求寻找字符串中的最长回文。 当然,我们可以使用下面的程序判断字符串s[i:j+1]是否是回文。
1 2 3 4 5 6 7 8 9 10
| func isPalindromic(s *string, i, j int ) bool { for i< j { if (*s)[i] != (*s)[j] { return false } i++ j-- } return true }
|
但是,这样就没有利用回文的一下特点,假定回文的长度为l,x为任意字符
- 当l为奇数时,回文的
正中间段只会是,“x”,或“xxx”,或“xxxxx”,或…
- 当l为偶数时,回文的
正中间段只会是,“xx”,或“xxxx”,或“xxxxxx”,或…
- 同一个字符串的任意两个回文substring的
正中间段,不会重叠。
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| func longestPalindrome(s string) string { if len(s) < 2 { return s }
begin, maxLen := 0, 1
for i := 0; i < len(s); { if len(s)-i <= maxLen/2 { break }
b, e := i, i for e < len(s)-1 && s[e+1] == s[e] { e++ }
i = e + 1
for e < len(s)-1 && b > 0 && s[e+1] == s[b-1] { e++ b-- }
newLen := e + 1 - b if newLen > maxLen { begin = b maxLen = newLen } }
return s[begin : begin+maxLen] }
|
题解中很巧妙的运用了这样一段代码
1 2 3 4
| for e < len(s)-1 && s[e+1] == s[e] { e++ }
|
从而使对于回文数奇偶的处理统一起来。
我的答案中通过记录字符串来进行比较和返回,题解则通过记录回文数的头下标及回文数的最长长度来进行比较和返回,使执行用时和内存消耗都小了很多。
总结