题目:5. 最长回文子串
给你一个字符串 s
,找到 s
中最长的回文子串。
- 回文:如果字符串向前和向后读都相同,则它满足回文性;
- 子串:子字符串 是字符串中连续的非空字符序列。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
解题思路
算法思路是通过遍历字符串中的每个字符或字符对,以它们为中心向两侧扩展,找到最长回文字符串,并记录最大长度和起始位置。最后根据最长回文字符串的起始位置和长度,截取出最长回文子串并返回
实现代码
package leetcodefunc longestPalindrome(s string) string {length := len(s)getLen := func(i, j int) int {// 以s[i]s[j]为中心的最长回文字符串for i >= 0 && j < length {if s[i] == s[j] {i--j++} else {return j - i - 1}}return j - i - 1}max := 0maxStart := 0for i := 0; i < length; i++ {if Max(getLen(i, i+1), getLen(i, i)) > max {max = Max(getLen(i, i+1), getLen(i, i))maxStart = i - (max-1)/2}}maxString := ""for i := maxStart; i < maxStart+max; i++ {maxString += string(s[i])}return maxString
}func Max(i, j int) int {if i >= j {return i}return j
}
复杂度分析
- 时间复杂度: $ O(n^2) $
- 空间复杂度: $ O(1) $
单元测试
package leetcodeimport ("testing""github.com/stretchr/testify/assert"
)func Test_longestPalindrome(t *testing.T) {assert := assert.New(t)type args struct {s string}tests := []struct {args argswant string}{{args: args{s: "babad"},want: "bab",},{args: args{s: "cbbd"},want: "bb",},}for _, tt := range tests {actual := longestPalindrome(tt.args.s)assert.Equal(tt.want, actual)}
}
- 知识星球:云原生AI实战营。10+ 高质量体系课( Go、云原生、AI Infra)、15+ 实战项目,P8 技术专家助你提高技术天花板,入大厂拿高薪;
- 公众号:令飞编程,分享 Go、云原生、AI Infra 相关技术。回复「资料」免费下载 Go、云原生、AI 等学习资料;
- 哔哩哔哩:令飞编程 ,分享技术、职场、面经等,并有免费直播课「云原生AI高新就业课」,大厂级项目实战到大厂面试通关;