5、最长回文字串-cangjie

题目

5、最长回文字串

思路

遍历每个字符,向外推开,记录最长的回文串的开始位置和长度,因为仅需一种合理答案即可,因此直接记录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)
    }
}

复杂度

时间复杂度

  1. 外层循环

    • 代码使用了一个外层循环 for (i in 0..len),遍历输入字符串中的每一个字符,时间复杂度为 O(n),其中n是字符串的长度。
  2. 内层循环

    • 对于每个字符,代码执行了 两次 内层循环:
      • 第一个内层循环处理奇数长度的回文(例如,"aba")。
      • 第二个内层循环处理偶数长度的回文(例如,"abba")。
    • 在最坏情况下,这两个内层循环可能需要每次都遍历剩余的字符串,即最多也会遍历整个字符串的长度。
    • 因此,单次外层循环的总复杂度为 O(n)
  3. 总时间复杂度

    • 由于外层循环与内层循环结合,整体的时间复杂度为: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)

结果

在这里插入图片描述
在这里插入图片描述

cangjie_pass
c_pass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值