1. 暴力

时间复杂度O(n^3)。

2. 延展

以某一字符为中心,设置left, right两个变量同时向外扩,判断他们指向字符是否相同。注意分奇偶讨论。时间复杂度O(n^2)。

3. Manacher 马拉车

代码注释:

 1 const int MAXN = 110009;
2 char ma[MAXN * 2]; //因为要添加'#',所以长度要开两倍
3 int mp[MAXN * 2];
4 char s[MAXN];
5
6 void Manacher(char s[], int len) {
7
8 // 1. 构造字符串,添加'#',使长度变为奇数(2 * len - 1)
9 int l = 0;
10 ma[l++] = '$'; // 设置边界
11 ma[l++] = '#';
12 for(int i = 0; i < len; i ++) {
13 ma[l++] = s[i];
14 ma[l++] = '#';
15 }
16 ma[l] = 0;
17
18 // 核心: 求回文半径, 回文半径包括中心点
19 int mx = 0; // mx代表可达的最右值
20 int id = 0; // id代表mx的中心
21 for(int i = 0; i < l; i ++) {
22 mp[i] = mx > i ? min(mp[2 * id - i], mx - i) : 1;
23 while(ma[i + mp[i]] == ma[i - mp[i]]) {
24 mp[i] ++;
25 }
26 if(i + mp[i] > mx) {
27 mx = i + mp[i];
28 id = i;
29 }
30 }
31
32 }
33
34 int main()
35 {
36
37 while(scanf("%s", s) != EOF) {
38 int len = strlen(s);
39 Manacher(s, len);
40 int ans = 0;
41 for(int i = 0; i < 2 * len + 2; i ++) { // 寻找最长的回文半径,即回文串长度
42 ans = max(ans, mp[i] - 1); // 回文半径减1就是原回文串的长度(回文半径中虚加了#)
43 cout << mp[i] << " ";
44 }
45 printf("%d\n", ans);
46 }
47
48 return 0;
49 }

时间复杂度O(n)。

最新文章

  1. UVA 1513 Movie collection (树状数组+反向存储)
  2. HTML 5表单应用小结
  3. JavaScript中对象的比较
  4. php 简单分页类
  5. delphi7的新生,参与分布式应用开发,调用RESTful API,Json的应用
  6. Google Code Jam 2010 Round 1B Problem A. File Fix-it
  7. 教你区分LVDS屏线及屏接口定义
  8. ubuntu不能正常使用make menuconfig的解决方案
  9. HDU5668 Circle 非互质中国剩余定理
  10. HW4.19
  11. python urllib2详解及实例
  12. 使用runOnUiThread更新UI
  13. Chrome 扩展 最近的历史 HistoryBar v1.1
  14. mvn
  15. HTML5+js页面传值给Java后台的小技巧
  16. qr-mili Tekniskt st&#246;d
  17. intellij idea 2018
  18. Ubuntu18.04更换国内源
  19. php父级目录文件包函问题
  20. HBTS(HBOI) 2019 真实退役记

热门文章

  1. 用python写图片格式批量处理工具
  2. 网页客服思路以及QQ截图粘贴到聊天框功能
  3. SVN 使用教程 命令 visual studio 使用SVN
  4. vSphere Esxi 6.x 常用序列号
  5. 前端可视化开发--liveload
  6. LeetCode数组移除数组中目标元素等题目
  7. 【Mongodb】后台主键_id自增(Java版本)
  8. KafkaProducer 简析
  9. Linux 时间同步 02 ntpd、ntpdate的区别
  10. Spring Security OAuth2.0认证授权二:搭建资源服务