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

马拉车算法

求回文子串

LeetCode 647
思路参考这里

代码实现

class Solution {
public:
    // Manacher 模板
    int countSubstrings(string s) {
        // [STEP1] 修改源字符串
        // 将 s 改造为 t,这样就不需要讨论 s.length() 的奇偶性,因为新串 t 的每个回文子串都是奇回文串(都有回文中心)
        // s 和 t 的下标转换关系:
        // (si+1)*2 = ti
        // ti/2-1 = si
        // ti 为偶数,对应奇回文串(从 2 开始)
        // ti 为奇数,对应偶回文串(从 3 开始)
        string t = "^";
        for (char c : s) {
            t += '#';
            t += c;
        }
        t += "#$";

        // [STEP2] 计算回文半径
        // 定义一个奇回文串的回文半径=(长度+1)/2,即保留回文中心,去掉一侧后的剩余字符串的长度
        // half_len[i] 表示在 t 上的以 t[i] 为回文中心的最长回文子串的回文半径
        // 即 [i-half_len[i]+1,i+half_len[i]-1] 是 t 上的一个回文子串
        vector<int> half_len(t.length() - 2);
        half_len[1] = 1;

        int ans = 0;
        // box_r 表示当前右边界下标最大的回文子串的右边界下标+1
        // box_m 为该回文子串的中心位置,二者的关系为 r=mid+half_len[mid]
        int box_m = 0, box_r = 0;
        for (int i = 2; i < half_len.size(); i++) {
            int hl = 1;
            if (i < box_r) {
                // 记 i 关于 box_m 的对称位置 i'=box_m*2-i
                // 若以 i' 为中心的最长回文子串范围超出了以 box_m 为中心的回文串的范围(即 i+half_len[i'] >= box_r)
                // 则 half_len[i] 应先初始化为已知的回文半径 box_r-i,然后再继续暴力匹配
                // 否则 half_len[i] 与 half_len[i'] 相等
                hl = min(half_len[box_m * 2 - i], box_r - i);
            }

            // 暴力扩展
            // 算法的复杂度取决于这部分执行的次数
            // 由于扩展之后 box_r 必然会更新(右移),且扩展的的次数就是 box_r 右移的次数
            // 因此算法的复杂度 = O(t.length()) = O(n)
            while (t[i - hl] == t[i + hl]) {
                hl++;
                box_m = i;
                box_r = i + hl;
            }

            half_len[i] = hl;
            ans += hl / 2;
        }

        return ans;
    }
};

相关文章:

  • 存储管理(一)
  • Flutter Autocomplete 从入门到进阶:打造智能输入体验的完整指南
  • 远程连接电脑
  • week2|机器学习(吴恩达)学习笔记
  • 微服务间通信
  • 畅捷通T+与吉客云数据集成案例解析
  • 直流分量的产生以及危害,THD总谐波失真度的定义,有哪些危害
  • 蓝桥杯 子2023
  • 博卡软件管理中心8:为美容美发行业量身打造的轻量级管理方案
  • ch05 课堂参考代码
  • Selenium Web自动化如何快速又准确的定位元素路径,强调一遍是元素路径
  • 【C#】Task 线程停止
  • 大模型在支气管扩张预测及治疗方案制定中的应用研究
  • Leetcode 组合总和 III
  • 计算机期刊征稿 | 计算机-网络系统:物联网系统架构、物联网使能技术、物联网通信和网络协议、物联网服务和应用以及物联网的社会影响
  • android studio 运行flutter项目
  • 提示词工程 — 科研论文笔记
  • 软件工程面试题(八)
  • 文章记单词 | 第14篇(六级)
  • 【极速版 -- 大模型入门到进阶】LORA:大模型轻量级微调
  • 网站建设培训 ppt/怎么找到精准客户资源
  • 模块化网站建设 局域网/建设营销网站
  • 手机网站制作哪家便宜/百度seo排名优化软件化
  • wordpress和laravel/海洋seo
  • 网站制作的预算/抖音搜索引擎推广
  • 网站建设安全吗/广告做到百度第一页