美文网首页
马拉车算法

马拉车算法

作者: zcaaron | 来源:发表于2017-02-18 21:14 被阅读297次
//Manacher's Algorithm (马拉车算法)
    class func longestPalindrome_ma(s: String) -> String {
        var charactersArr = Array<Character>()
        var resultString = String()
        var maxPoint = 0

        charactersArr.append("$")
        for character in s.characters {
            charactersArr.append("#")
            charactersArr.append(character)
        }
        charactersArr.append("#")
        charactersArr.append("%")

        var rightMax = 0, middlePoint = 0
        var lenArr = Array.init(repeating: 1, count: charactersArr.count)

        for i in 1 ..< 2 * s.characters.count + 2 {
            if rightMax > i {
                lenArr[i] = min(rightMax - i, lenArr[2 * middlePoint - i])
            }

            while charactersArr[i - lenArr[i]] == charactersArr[i + lenArr[i]] {
                lenArr[i] += 1
            }

            if lenArr[i] + i > rightMax {
                middlePoint = i

                rightMax = lenArr[i] + i
            }

            if lenArr[i] > lenArr[maxPoint] {
                maxPoint = i
            }
        }

        for i in stride(from: maxPoint - (lenArr[maxPoint] - 2), to: maxPoint + (lenArr[maxPoint] - 1), by: 2) {
            resultString.append(charactersArr[i])
        }

        return resultString
    }
}

相关文章

网友评论

      本文标题:马拉车算法

      本文链接:https://www.haomeiwen.com/subject/hgjdwttx.html