美文网首页
马拉车算法

马拉车算法

作者: 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