解题思路一:我们所需的时间复杂度是O(N)
用一个字典保存一个字符串出现的第一次index,然后遍历字符串直到结束。
代码如下:
class Solution {
func longestPalindrome(_ s: String) -> String {
var dic = [Character : Int]()
var maxLength = 0
var currentChar: Character?
var index = 0
s.forEach { (char) in
if let startIndex = dic[char]{
let length = index + 1 - startIndex
if length > maxLength {
currentChar = char
maxLength = length
}
}else{
dic[char] = index
}
index += 1
}
if maxLength == 0{
if s.length > 1{
return String(s[s.index(s.endIndex, offsetBy: -1)..<s.endIndex])
}else{
return s
}
}else{
let startIndex = dic[currentChar!]
let sIndex = s.index(s.startIndex, offsetBy: startIndex!)
let eIndex = s.index(sIndex, offsetBy:maxLength)
return String(s[sIndex..<eIndex])
}
}
}
第二种解法:
采用快速遍历:
一个从头开始计算一个从尾部开始。