题目
思路
遍历每个字符,向外推开,记录最长的回文串的开始位置和长度,因为仅需一种合理答案即可,因此直接记录start和len
代码
class Solution {
func longestPalindrome(s: String): String {
let len = s.size
if(len < 2){
return s
}
var maxlen = 1
var start = 0
for(i in 0..len){
var left = i
var right = i
while(left >= 0 && right < len && s[left] == s[right]){
if(maxlen < right - left + 1){
maxlen = right - left + 1
start = left
}
left--
right++
}
left = i
right = i + 1
while(left >= 0 && right < len && s[left] == s[right]){
if(maxlen < right - left + 1){
maxlen = right - left + 1
start = left
}
left--
right++
}
}
let arr = s.toRuneArray()
let resarr = arr.slice(start, maxlen)
return String(resarr)
}
}
复杂度
时间复杂度
-
外层循环:
- 代码使用了一个外层循环
for (i in 0..len),遍历输入字符串中的每一个字符,时间复杂度为O(n),其中n是字符串的长度。
- 代码使用了一个外层循环
-
内层循环:
- 对于每个字符,代码执行了 两次 内层循环:
- 第一个内层循环处理奇数长度的回文(例如,
"aba")。 - 第二个内层循环处理偶数长度的回文(例如,
"abba")。
- 第一个内层循环处理奇数长度的回文(例如,
- 在最坏情况下,这两个内层循环可能需要每次都遍历剩余的字符串,即最多也会遍历整个字符串的长度。
- 因此,单次外层循环的总复杂度为
O(n)。
- 对于每个字符,代码执行了 两次 内层循环:
-
总时间复杂度:
- 由于外层循环与内层循环结合,整体的时间复杂度为:
O(n^2)
- 由于外层循环与内层循环结合,整体的时间复杂度为:
空间复杂度
O(1)(不考虑返回值)
结论
- 时间复杂度:
O(n^2) - 空间复杂度:
O(1)
遇到的坑
家人们谁懂啊,仓颉居然不支持string直接slice,需要转成array来slice,狠狠的无语了
let arr = s.toRuneArray()
let resarr = arr.slice(start, maxlen)
return String(resarr)
怀念cpp的
return string(s.begin()+start, s.begin()+start+maxlen)
结果



572

被折叠的 条评论
为什么被折叠?



