题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
解题思路
1.如何判断一个字符串是回文(从中间开始左右两边同时移动,如果左边等于右边就是回文串)
2.还有就是如何判断下标就是在中间(下标把整个字符串都遍历一遍才能找到最长的那个)
解题代码
暴力破解
所有例子都能通过,只是时间复杂度太高O(n^3),超时
func isHuiWen(s string) bool {
slen := len(s)
for i,_ := range s {
if s[slen - i -1] != s[i] {
return false
}
}
return true
}
func longestPalindrome(s string) string {
frontIndex := 0
afterIndex := 1
frontIndexMax := 0
afterIndexMax := 0
len := len(s)
for frontIndex <= len {
for afterIndex <= len {
s2 := s[frontIndex:afterIndex]
if isHuiWen(s2) {
if afterIndexMax - frontIndexMax < afterIndex - frontIndex {
afterIndexMax = afterIndex
frontIndexMax = frontIndex
}
}
afterIndex ++
}
frontIndex ++
afterIndex = frontIndex + 2
}
return s[frontIndexMax:afterIndexMax]
}
折中遍历法
func longestPalindrome02(s string) string {
frontIndex := 0
afterIndex := 0
i := -1
for i < len(s) - 1 {
i++
i := GetAns(i, s, &frontIndex, &afterIndex)
i ++
}
return s[afterIndex:frontIndex + 1]
}
// 获取前标和后标
func GetAns(after int,s string,frontIndex *int,afterIndex *int) int {
front := after
i := len(s)
for front < i - 1 && s[front + 1] == s[after] {
front++
}
ans := front
for after > 0 && front < i - 1 && s[front + 1] == s[after - 1] {
after--
front++
}
if *frontIndex - *afterIndex < front - after {
*frontIndex = front
*afterIndex = after
}
return ans
}
提交结果
第一种运行超时
第二种: