难度:
中等
描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例
1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
2:
输入: "cbbd"
输出: "bb"
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
语言:
swift
解析:
该题求回文字符串,难点在形如aba
和aa
都算回文字符串。所以我打算在每个字符串的中间和字符串收尾加一个占位符#
,这样等于强制将可比较的字符串变成了奇数长度。然后我去遍历字符串,分别取每个字符的正负可偏移量offset
,对每个字符的正负方向上去找是否有满足的回文字符串。
代码如下:
class Solution {
func longestPalindrome(_ s: String) -> String {
if s.count == 0 || s == "" {
return ""
}
var longestString = ""
let stringArray = Array(s)
var insertArray = Array<Character>()
for index in 0...stringArray.count * 2 {
if index % 2 == 0 {
insertArray.append(Character("#"))
} else {
insertArray.append(stringArray[(index - 1) / 2])
}
}
let arrayLength = insertArray.count
for index in 1...insertArray.count - 2 {
let value = insertArray[index]
let maxOffset = index <= arrayLength - 1 - index ? index : arrayLength - 1 - index
var tempString = String(value)
if tempString == "#" {
tempString = ""
}
for offset in 1...maxOffset {
let offsetLeftValue = insertArray[index - offset]
let offsetRightValue = insertArray[index + offset]
if offsetLeftValue != offsetRightValue {
break
} else {
if offsetLeftValue != "#" {
tempString = String(offsetLeftValue) + tempString + String(offsetRightValue)
}
}
}
if longestString.count < tempString.count {
longestString = tempString
}
}
return longestString
}
}
总结
这是一道动态规划题,但我并没有按常理解答,还有待优化的地方。