当前位置: 首页 > wzjs >正文

怎么套用模板做网站培训心得体会总结

怎么套用模板做网站,培训心得体会总结,网站建设QQ刷赞,专业小程序商城开发🧩 最长回文子串问题:三种经典解法全解析(含代码注释) 本文将系统讲解“最长回文子串”问题的三种常见解法:中心扩展法、动态规划、马拉车算法(Manacher’s Algorithm),并进行对比与…

🧩 最长回文子串问题:三种经典解法全解析(含代码注释)

本文将系统讲解“最长回文子串”问题的三种常见解法:中心扩展法、动态规划、马拉车算法(Manacher’s Algorithm),并进行对比与总结。


📌 问题描述

给定一个字符串 s,返回其中 最长的回文子串

示例:

  • 输入:"babad"
  • 输出:"bab""aba"

✅ 解法一:中心扩展法(Expand Around Center)

🧠 思路

  • 回文的本质是“对称”
  • 遍历每个字符,尝试以它为中心向两边扩展,总共需要考虑 2n - 1 个中心(包括字符与字符之间的间隙)。
  • 需要对奇数长度(如 "aba")和偶数长度(如 "abba")分别处理

⏱ 复杂度

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)

🧑‍💻 Swift 实现(含注释)

func longestPalindromeCenter(_ s: String) -> String {if s.isEmpty { return "" }let chars = Array(s)var start = 0, end = 0for i in 0..<chars.count {let len1 = expand(chars, left: i, right: i) // 奇数长度let len2 = expand(chars, left: i, right: i + 1) // 偶数长度let len = max(len1, len2)if len > end - start {start = i - (len - 1) / 2end = i + len / 2}}return String(chars[start...end])
}func expand(_ chars: [Character], left: Int, right: Int) -> Int {var L = left, R = rightwhile L >= 0 && R < chars.count && chars[L] == chars[R] {L -= 1R += 1}return R - L - 1 // 实际回文长度
}

✅ 解法二:动态规划(Dynamic Programming)

🧠 思路

  • 定义 dp[i][j] 表示 s[i...j] 是否为回文串。
  • 转移方程:
    • dp[i][j] = true if s[i] == s[j] && dp[i+1][j-1]

⏱ 复杂度

  • 时间复杂度:O(n²)
  • 空间复杂度:O(n²)

🧑‍💻 Swift 实现(含注释)

func longestPalindromeDP(_ s: String) -> String {let chars = Array(s)let n = chars.countif n < 2 { return s }var dp = Array(repeating: Array(repeating: false, count: n), count: n)var maxLen = 1var start = 0for i in 0..<n {dp[i][i] = true}for length in 2...n {for i in 0...(n - length) {let j = i + length - 1if chars[i] == chars[j] {if length == 2 {dp[i][j] = true} else {dp[i][j] = dp[i + 1][j - 1]}if dp[i][j] && length > maxLen {maxLen = lengthstart = i}}}}return String(chars[start..<start + maxLen])
}

✅ 解法三:马拉车算法(Manacher’s Algorithm)

🧠 思路

  • 首先对字符串预处理,使得所有回文都是奇数长度(例如:"abba""#a#b#b#a#"
  • 使用数组 p[i] 记录以第 i 个字符为中心的最大回文“半径”
  • 利用已知的对称中心和边界进行跳跃扩展,从而实现线性时间复杂度

⏱ 复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

🧑‍💻 Swift 实现(含注释)

func longestPalindromeManacher(_ s: String) -> String {// Step 1: 预处理字符串,在每个字符中间加入 #let t = Array("#" + s.map { "\($0)#" }.joined())let n = t.countvar p = Array(repeating: 0, count: n)var center = 0, right = 0var maxLen = 0, maxCenter = 0for i in 0..<n {let mirror = 2 * center - i // i 关于 center 的对称点// Step 2: 利用镜像对称性快速扩展if i < right {p[i] = min(right - i, p[mirror])}// Step 3: 尝试向左右扩展var a = i + p[i] + 1var b = i - p[i] - 1while a < n && b >= 0 && t[a] == t[b] {p[i] += 1a += 1b -= 1}// Step 4: 更新 center 和 rightif i + p[i] > right {center = iright = i + p[i]}// Step 5: 更新最大值if p[i] > maxLen {maxLen = p[i]maxCenter = i}}// Step 6: 从原始字符串中提取结果let start = (maxCenter - maxLen) / 2let end = start + maxLenreturn String(s[s.index(s.startIndex, offsetBy: start)..<s.index(s.startIndex, offsetBy: end)])
}

🧪 示例输出

print(longestPalindromeCenter("babad"))   // 输出: "bab" 或 "aba"
print(longestPalindromeManacher("cbbd"))  // 输出: "bb"
print(longestPalindromeDP("babad"))  // "bab" 或 "aba"

📊 三种方法对比总结

算法时间复杂度空间复杂度实现难度适用场景
中心扩展法O(n²)O(1)⭐⭐ 易面试首选,简洁实用
动态规划O(n²)O(n²)⭐⭐⭐ 中等适用于变种题型
马拉车算法O(n)O(n)⭐⭐⭐⭐ 高性能关键、竞赛场景

✅ 最佳实践推荐

需求推荐方法
面试、日常开发、可读性✅ 中心扩展法
遇到类似子串变种问题✅ 动态规划
超大数据量、刷算法题、竞赛✅ 马拉车算法

http://www.dtcms.com/wzjs/81416.html

相关文章:

  • 如可做网站如何自己开发一个平台
  • 盐山县招聘网站建设百度贴吧人工客服电话
  • 济南网站建设云华互动北京seo招聘信息
  • 苏州专业的网站建设公司2021近期时事新闻热点事件
  • 国际足联世界排名九江seo
  • 接做网站简介营销软件商城
  • wordpress怎么建设网站在百度怎么发布作品
  • 这几年做啥网站致富百度推广管家登录
  • 西安网站建设方案外包深圳网络推广公司排名
  • 天津网站建设多少钱谷歌网页
  • 源码站用dz wordpress如何做平台推广
  • 作图网站做课程表淄博seo推广
  • 个人 备案 经营性网站备案在线生成个人网站
  • 教做世界美食的网站网站优化的方法与技巧
  • 怎么做网站排名优化网站设计制作哪家好
  • php怎样做网站的注删页面seo网站结构优化
  • 马鞍山北京网站建设广告文案
  • 网站首页置顶是怎么做成都多享网站建设公司
  • 做微信链接的网站百度联盟推广
  • wordpress 一键迁移链接优化方法
  • 深圳注册公司地址新规定网站百度关键词优化
  • 网站开发文档管理工具关键词快速上首页排名
  • seo 技术优化百度seo网站
  • 湘潭网站建设建站google chrome谷歌浏览器
  • 网站建设案例基本流程wordpress seo教程
  • 建设网站用哪个主机好合肥网站优化方案
  • 360网站做推广seo视频
  • b2b系统哪家好百度seo排名优化软件
  • 移动端网站开发前端模板邯郸seo优化
  • 易搭应用快速开发平台潍坊seo教程