【题目】

给你一个字符串,找出该字符串中对称的子字符串的最大长度。即求最大回文串。

【思路1】暴力法

即不使用技巧,穷举所有可能。时间复杂度为O(n^3)(时间上最长,不推荐使用),空间复杂度为O(1)。

本思路是从最大长度的字串开始,而不是从最小开始。假如说给定的字符串为len,先遍历长度为len的字串是否为回文串,如果是停止,

如果不是遍历长度为len-1的字串是否是回文串,一次类推。

#include <iostream>
using namespace std;
//是否是回文串
bool IsPalindromeSubNumber(string num){int len = num.length();for(int i = 0,j=len-1;i < j;i++,j--){if(num[i] != num[j]){return false;}}return true;
}
void MaxSubPalindromeNumber(string num){bool result;bool flag = false;int len = num.length();//遍历字串的长度for(int i = len;i > 0;i--){//遍历字串的起始位置for(int j = 0;j+i <= len;j++){result = IsPalindromeSubNumber(num.substr(j,i));if(result){flag = true;cout<<num.substr(j,i)<<endl;}}if(flag){break;}}
}int main(){string num = "djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";MaxSubPalindromeNumber(num);return 0;
}

【思路2】

假设现在已经遍历到第 i 个字符,要找出以该字符为“中心”的最长对称字符串,我们需要用另两个指针分别向前和向后移动,直到指针到达字符串两端或者两个指针所指的字符不相等。因为对称子字符串有两种情况,所以需要写出两种情况下的代码:

(1) 第 i 个字符是该对称字符串的真正的中心,也就是说该对称字符串以第 i 个字符对称, 比如: “aba”

(2)第 i 个字符串是对称字符串的其中一个中心。比如“abba”。

所以遍历到每个字符都要考虑两种情况,它可能是在奇数个回文串中或者是在偶数个回文串中

#include<string>
#include<iostream>
using namespace std;string MaxPalindromeNumber(string str){int maxLen = 1,start = 0;int len = str.length();string s = str;int left,right;for(int i = 0;i < len;i++){//奇数字串int oddLen = 1;left = i-1;right = i+1;while(left >= 0 && right < len && str[left] == str[right]){left--;right++;oddLen += 2;}//更新最大长度if(oddLen > maxLen){maxLen = oddLen;//记录当前最大回文串的起始位置start = left+1;}//偶数字串left = i;right = i+1;int evenLen = 0;while(left >= 0 && right < len && str[left] == str[right]){left--;right++;evenLen += 2;}//更新最大长度if(evenLen > maxLen){maxLen = evenLen;//记录当前最大回文串的起始位置start = left+1;}}return str.substr(start,maxLen);
}int main(){string str="djdslkAABCDEAfjdl1234321skjflkdsjfkldsababasdlkfjsdwieowowwpw";string s=MaxPalindromeNumber(str);cout<<s<<endl;return 0;
}

【思路三】Manacher算法

算法的基本思路是这样的:把原串每个字符中间用一个串中没出现过的字符分隔#开来(统一奇偶),同时为了防止越界,在字符串的首部也加入一个特殊符$,但是与分隔符不同。同时字符串的末尾也加入'\0'。算法的核心:用辅助数组p记录以每个字符为核心的最长回文字符串半径。也就是p[i]记录了以str[i]为中心的最长回文字符串半径。p[i]最小为1,此时回文字符串就是字符串本身。 
示例:原字符串 'abba’,处理后的新串 ' $#a#b#b#a#\0’,得到对应的辅助数组p=[0,1,1,2,1,2,5,2,2,1]。

详细请看:[算法]Manacher算法之最大回文子串

#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
//数据预处理
char* Init(char* s){int len = strlen(s);char* str = new char(2*len+4);str[0] = '$';int index = 1;for(int i = 0;i < len;i++){str[index++] = '#';str[index++] = s[i];}str[index++] = '#';str[index] = '\0';return str;
}char* MaxPalindromeNumber(char* s){char *str = Init(s);int maxId = 0,center = 1;int len = strlen(str);int *p = new int[len+1];// MaxId为i字符之前最大回文串向右延伸的最大位置// id为MaxId对应的最大回文串的中心位置for(int i = 1;i < len;i++){//初步定i位置字符为中心的半径if(maxId > i){p[i] = min(maxId - i,p[2*center - i]);}else{p[i] = 1;}//继续确定i位置字符为中心的半径 这地方用到'$'while(str[i-p[i]] == str[i+p[i]]){p[i]++;}//更新MaxId,idif(p[i]+i > maxId){maxId = p[i] + i;center = i;}}// 最大长度int maxLen = 0;center = 1;for(int i = 1;i < len;i++){if(str[i] != '#' && p[i] - 1 > maxLen){maxLen = p[i] - 1;center = i;}}//提取最大回文串char* maxStr = new char[maxLen+1];int index = 0;for(int i = center - maxLen;i <= center + maxLen;i++){if(str[i] != '#'){maxStr[index++] = str[i];}}maxStr[index] = '\0';return maxStr;
}int main(){char* str="skjflkdsjfkldsababasdlkfjsdwieowowwpw";cout<<MaxPalindromeNumber(str);return 0;
}

相关链接:

[小米]2015小米校招之回文数判断

[网易]字符串回文分割

[百度]2014百度校园招聘之最长回文串相关推荐

  1. 伍六七带你学算法 入门篇-最长回文串

    力扣解题,每日一题:409. 最长回文串 难度- 简单 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" ...

  2. manacher算法----O(n)最长回文串

    manacher算法----O(n)最长回文串 分类:字符串 (126)  (0)  举报  收藏 manacher的时间复杂度为O(n),后缀数组好像可以处理O(nlogn),但是有些变态题目可能卡 ...

  3. python【力扣LeetCode算法题库】409-最长回文串(数学 计数器)

    最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字 ...

  4. 通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)

    1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...

  5. Leetcode69场双周赛-第三题5962. 连接两字母单词得到的最长回文串

    5962. 连接两字母单词得到的最长回文串 题目描述 解题思路和解题代码 定义map和sameMap.如果两个字母一样,就看sameMap里面有没有记录,有的话把该记录取出来,结果总数+4,没有的话, ...

  6. 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串

    1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...

  7. java 最长回文串_通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)...

    1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...

  8. 最长回文串--动态规划

    最长回文串–动态规划 参考:https://writings.sh/post/algorithm-longest-palindromic-substring class Solution {publi ...

  9. 1616: 最长回文串(马拉车算法)

    1616: 最长回文串 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description 求一个字符串的最长 ...

最新文章

  1. html判断对错,Html翻转校园试题
  2. 如何在Cordova Android 7.0.0 以下版本集成最新插件 极光插件为例 1
  3. .Net Validator验证框架 [ .Net | Validator Framework | Attribute ]
  4. Mysql 主从复制常用管理任务介绍
  5. Lvs Tun隧道模式配置
  6. 开源纯C#工控网关+组态软件(四)上下位机通讯原理
  7. 26.0.0-alpha1_WildFly 8.0.0.Alpha1的发布和一些历史
  8. Java之路:this关键字的用法
  9. gcc 编译python_4 个快速的 Python 编译器 for 2018
  10. 吴恩达《机器学习》第六章:逻辑回归
  11. es6中一些基本的使用方法
  12. python函数手册(1)
  13. sign-canvas 一个基于canvas开发,封装于Vue组件的通用手写签名板(电子签名板),支持pc端和移动端;
  14. 计算机平面设计与工程论文,计算机平面设计毕业论文范文2篇
  15. python 异常 exception_关于Python中异常(Exception)的汇总
  16. 公众号内测算法推荐引争议,却有小号因此阅读增长20倍
  17. HANA 存储过程 YTD
  18. 【算法导论】 二叉搜索树、AVL树、和红黑树
  19. apiserver 补充 限流认证 以及mutating流程
  20. “大众点评开发者平台”正式上线

热门文章

  1. 冒险岛教程一:修改封包加解密(AES_OFB)
  2. 机器学习之线性回归值预测算法
  3. 市场调研-乳清酸一水合物市场现状及未来发展趋势
  4. RSA 实现数据加密解密以及Token管理
  5. 高等数学-二重积分思维导图
  6. VS2008 打开程序弹窗:save changes to the following items devenv sln问题
  7. Activity的生命周期之图记表查
  8. UVM中Objection的作用
  9. 图像处理与计算机视觉用c语言吗,即将不再只是图像的CVer,计算机视觉要变天...
  10. iOS学习之iOS5.0以上 使用新浪微博开放平台OAuth