LeetCode 刷題筆記 - 5. 最長迴文子串

難度:

中等swift

描述:

給定一個字符串 s,找到 s 中最長的迴文子串。你能夠假設 s 的最大長度爲 1000。bash

示例

1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。
複製代碼
2:

輸入: "cbbd"
輸出: "bb"
複製代碼

來源:力扣(LeetCode) 連接:leetcode-cn.com/problems/lo… 著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。網絡


語言:

swiftapp

解析:

該題求迴文字符串,難點在形如abaaa都算迴文字符串。因此我打算在每一個字符串的中間和字符串收尾加一個佔位符#,這樣等於強制將可比較的字符串變成了奇數長度。而後我去遍歷字符串,分別取每一個字符的正負可偏移量offset,對每一個字符的正負方向上去找是否有知足的迴文字符串。優化

代碼以下:ui

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
    }
}
複製代碼

總結

這是一道動態規劃題,但我並無按常理解答,還有待優化的地方。spa

相關文章
相關標籤/搜索