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

左神算法进阶班1_4Manacher算法

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 //使用manacher算法寻找字符中最长的回文子串
 7 
 8 int Manacher(string str)
 9 {
10     //字符串预处理
11     string newStr = "#";
12     for (auto c : str)
13         newStr = newStr + c + "#";
14     //回文半径记录数组
15     int* rIndex = new int[newStr.length()];
16     int c = -1;//回文中心
17     int R = -1;//回文右边界 R位于回文对称右边界的右边一个字母
18     int maxL = INT_MIN;//记录最长回文字长
19     for (int i = 0; i < newStr.length(); ++i)
20     {
21         //第一步直接取得可能的最短的回文半径,当i>R时,最短的回文半径是1,
22         //反之,最短的回文半径可能是i对应的i'的回文半径或者i到R的距离
23         if (R > i)
24             rIndex[i] = rIndex[2 * c - i] < R - i ? rIndex[2 * c - i] : R - i;
25         else
26             rIndex[i] = 1;
27         //取最小值后开始从边界暴力匹配,匹配失败就直接退出
28         while (i + rIndex[i] < newStr.length() && i - rIndex[i] > -1)
29         {
30             if (newStr[i + rIndex[i]] == newStr[i - rIndex[i]])//向两边扩展,找回文字母
31                 rIndex[i]++;
32             else
33                 break;
34         }
35         //观察此时R和C是否能够更新
36         if (i + rIndex[i] > R)
37         {
38             R = i + rIndex[i];
39             c = i;
40         }
41         //更新最大回文半径的值
42         maxL = maxL > rIndex[i] ? maxL : rIndex[i];
43     }
44     delete[] rIndex;
45     //这里解释一下为什么返回值是maxn-1,因为manacherstring的长度和原字符串不同,
46     //所以这里得到的最大回文半径其实是原字符串的最大回文子串长度加1,
47     //有兴趣的可以自己验证试试,-1是为了将后面的‘#’去掉
48     return maxL - 1;    
49     
50 }
51 
52 void Test()
53 {
54     string str = "abc1234321ab";
55     cout << Manacher(str) << endl;
56 }

 

转载于:https://www.cnblogs.com/zzw1024/p/11031706.html

相关文章:

  • centos下安装mysql5.7
  • [Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
  • 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
  • PHP删除MySQL数据库下的所有数据表
  • 记:使用Xenocode加壳混淆后,无法“自杀覆盖”的自动更新
  • 数组相关排序
  • 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
  • Java基础学习总结(23)——GUI编程
  • JDBC 通过PreparedStatement 对数据库进行增删改查
  • JPA常用注解
  • php的插入排序,通过双层for循环
  • 我的Git忽略文件
  • SCSS(SASS、CSS)学习
  • Cenos7下nginx+mysql+php环境的搭建
  • Linux实用工具
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 03Go 类型总结
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Android单元测试 - 几个重要问题
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript实现分页效果
  • java概述
  • java小心机(3)| 浅析finalize()
  • Otto开发初探——微服务依赖管理新利器
  • PHP 7 修改了什么呢 -- 2
  • rabbitmq延迟消息示例
  • 二维平面内的碰撞检测【一】
  • 官方解决所有 npm 全局安装权限问题
  • 设计模式(12)迭代器模式(讲解+应用)
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 通信类
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 转载:[译] 内容加速黑科技趣谈
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • #LLM入门|Prompt#3.3_存储_Memory
  • #在 README.md 中生成项目目录结构
  • $.proxy和$.extend
  • (2)MFC+openGL单文档框架glFrame
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (一)Dubbo快速入门、介绍、使用
  • (一)插入排序
  • (转)scrum常见工具列表
  • (转)甲方乙方——赵民谈找工作
  • (转)平衡树
  • *** 2003
  • *上位机的定义
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Standard 的管理策略
  • .NET 指南:抽象化实现的基类