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

网站后台管理系统的重要技术指标收录快的门户网站

网站后台管理系统的重要技术指标,收录快的门户网站,广州定制网页设计,河南网站建设公司价格Problem: 5. 最长回文子串 文章目录整体思路完整代码时空复杂度时间复杂度:O(N^2)空间复杂度:O(1)整体思路 这段代码旨在解决经典的 “最长回文子串” (Longest Palindromic Substring) 问题。问题要求在一个给定的字符串 S 中,找到一个最长…

Problem: 5. 最长回文子串

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(N^2)
    • 空间复杂度:O(1)

整体思路

这段代码旨在解决经典的 “最长回文子串” (Longest Palindromic Substring) 问题。问题要求在一个给定的字符串 S 中,找到一个最长的、内容左右对称的连续子串。

该算法采用了一种非常高效且简洁的 中心扩展 (Expand From Center) 算法。其核心思想是,任何一个回文串,都有一个中心。这个中心可能是一个字符(对于奇数长度的回文串,如 “aba” 的中心是 ‘b’),也可能是两个字符之间的空隙(对于偶数长度的回文串,如 “abba” 的中心在两个 ‘b’ 之间)。

算法的逻辑步骤如下:

  1. 统一中心处理

    • 该算法最巧妙的一点是,它通过一个 for 循环 for (int i = 0; i < 2 * n - 1; i++) 来遍历所有可能的中心。
    • 一个长度为 n 的字符串,有 n 个单字符中心和 n-1 个字符间的中心,总共 2n-1 个。
    • 通过 l = i / 2r = (i + 1) / 2 这两个计算,可以巧妙地将这 2n-1 个虚拟中心索引 i 映射到字符串的实际索引起点:
      • i 是偶数时(例如 i=4),lr 会相等(l=2, r=2),这对应一个单字符中心,用于查找奇数长度的回文串。
      • i 是奇数时(例如 i=5),r会比l大1(l=2, r=3),这对应一个字符间中心,用于查找偶数长度的回文串。
  2. 从中心向两边扩展

    • 对于每一个确定的中心 (l, r),算法进入一个 while 循环。
    • 这个循环同时将左指针 l 向左移动 (l--) 和右指针 r 向右移动 (r++),并持续检查以下条件:
      a. 指针没有越界 (l >= 0 && r < n)。
      b. 两边指针指向的字符相等 (s[l] == s[r])。
    • 只要这些条件满足,就说明当前 [l, r] 范围内的子串是一个回文串,可以继续尝试扩展。
  3. 更新最长回文串记录

    • while 循环因不满足条件而终止时,最后一个有效的回文串是在 lr 停止移动之前的位置,即 [l+1, r-1]
    • 该回文串的长度为 (r-1) - (l+1) + 1 = r - l - 1
    • 算法将这个长度与已记录的最长回文串的长度进行比较。如果当前找到的更长,就更新 ansLeftansRight 来记录这个新发现的最长回文串的边界。
  4. 返回结果

    • 在遍历完所有 2n-1 个中心后,ansLeftansRight 中存储的就是全局最长回文子串的起始索引(包含)和结束索引(不包含)。
    • 最后,使用 S.substring(ansLeft, ansRight) 截取并返回结果。

完整代码

class Solution {/*** 找到字符串 S 中的最长回文子串。* @param S 输入的字符串* @return 最长的回文子串*/public String longestPalindrome(String S) {// 将字符串转换为字符数组,可以略微提高字符访问效率。char[] s = S.toCharArray();int n = s.length;// ansLeft: 记录最长回文子串的起始索引(包含)。int ansLeft = 0;// ansRight: 记录最长回文子串的结束索引(不包含)。int ansRight = 0;// 核心循环:遍历所有 2n-1 个可能的中心。// i 是一个虚拟的中心索引。for (int i = 0; i < 2 * n - 1; i++) {// 通过 i 计算出中心扩展的起始左右指针。// 如果 i 是偶数, l=r, 对应单字符中心 (奇数长度回文串)。// 如果 i 是奇数, r=l+1, 对应字符间中心 (偶数长度回文串)。int l = i / 2;int r = (i + 1) / 2;// 从中心 (l, r) 向两边扩展,寻找回文串。while (l >= 0 && r < n && s[l] == s[r]) {l--;r++;}// 循环结束后,最后一个有效回文串的边界是 [l+1, r-1]。// 其长度为 (r-1) - (l+1) + 1 = r - l - 1。// 当前记录的最长长度为 ansRight - ansLeft。if (r - l - 1 > ansRight - ansLeft) {// 如果找到了更长的回文串,则更新记录。// 新的起始索引是 l+1。ansLeft = l + 1;// 新的结束索引(不包含)是 r。ansRight = r;}}// 根据记录的边界,从原始字符串 S 中截取最长回文子串。return S.substring(ansLeft, ansRight);}
}

时空复杂度

时间复杂度:O(N^2)

  1. 外层循环for (int i = 0; i < 2 * n - 1; i++) 遍历了 2n-1 次,其复杂度为 O(N)
  2. 内层循环while (...) 循环是从每个中心向外扩展。在最坏的情况下(例如,字符串本身就是一个大回文串 “aaaaa…”),从中心开始的扩展可能会一直延伸到字符串的两端。每次扩展的操作数最多是 N/2 次(向左 N/2,向右 N/2)。因此,内层循环的复杂度是 O(N)
  3. 综合分析
    总的时间复杂度是外层循环和内层循环复杂度的乘积。即 O(N) * O(N) = O(N^2)

空间复杂度:O(1)

  1. 主要存储开销:算法的核心逻辑只使用了固定数量的整型变量(n, ansLeft, ansRight, i, l, r)来存储指针和结果边界。
  2. toCharArray()char[] s = S.toCharArray(); 创建了字符串的一个副本,占用了 O(N) 的空间。然而,在标准的算法复杂度分析中,这种对输入的表示转换通常不被计入额外辅助空间(auxiliary space),因为核心算法本身(指针操作)并不需要这部分空间(可以直接使用 S.charAt())。
  3. 综合分析
    如果我们只考虑算法逻辑本身所需的额外空间,那么空间复杂度为 O(1)
http://www.dtcms.com/a/494954.html

相关文章:

  • 降本增效:如何用RustFS将企业存储TCO降低50%?
  • 当AI遇到信息系统:以AI+用户推荐的标签生命周期为例——标签为什么需要“死亡“?
  • 数据结构入门 (九):线索的“寻路”指引 —— 详解线索二叉树
  • wordpress 织梦十堰网站优化
  • Vue+ts 如何实现父组件和子组件通信
  • 广告制作网站源码高端网站设计公司
  • cpp-stub工作原理详细举例解析
  • 香港服务器CPU中E5和Gold的区别
  • linux shell编程实战 02 变量与交互式输入
  • 网站下载怎么做如何建一个免费试用网站
  • 【LeetCode热题100(45/100)】二叉树展开为链表
  • VUE封装axios调用
  • python的scikit-image库的功能介绍(亲测)
  • 做go分析的网站第一成品网站超市
  • ArrayList和LinkedList的区别
  • PinWin,一个窗口置顶工具
  • 一键式搜索引擎Hacking工具
  • CasADi:高性能数值优化与自动微分工具库详解
  • 中英文网站建设企业网站列表设计
  • 在 iOS 18 中,控制中心怎样添加应用快捷方式?
  • C++类型转换
  • 【Memory协议栈】Autosar架构下如何加速Fee的切页时间
  • 【C# MVC 前置】异步编程 async/await:从 “卡界面” 到 “秒响应” 的 Action 优化指南(附微软官方避坑清单)
  • WRF-Chem模式编译,排放源制作
  • 网站管理和维护云服务器多少钱一台
  • 做外贸网站效果好吗万网首页
  • JavaWeb前端-Ajax
  • ip rule 策略路由
  • 【Zephyr电源与功耗专题】15_功耗优化测试工具与手段
  • 如何让多模态大模型学会“自动思考”-R-4B训练框架核心设计与训练方法