阅读 40

LeetCode 刷题笔记 - 5. 最长回文子串

难度:

中等

描述:

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例

1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
复制代码
2:

输入: "cbbd"
输出: "bb"
复制代码

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


语言:

swift

解析:

该题求回文字符串,难点在形如abaaa都算回文字符串。所以我打算在每个字符串的中间和字符串收尾加一个占位符#,这样等于强制将可比较的字符串变成了奇数长度。然后我去遍历字符串,分别取每个字符的正负可偏移量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
    }
}
复制代码

总结

这是一道动态规划题,但我并没有按常理解答,还有待优化的地方。