[百度]2014百度校园招聘之最长回文串
【题目】
给你一个字符串,找出该字符串中对称的子字符串的最大长度。即求最大回文串。
【思路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百度校园招聘之最长回文串相关推荐
- 伍六七带你学算法 入门篇-最长回文串
力扣解题,每日一题:409. 最长回文串 难度- 简单 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" ...
- manacher算法----O(n)最长回文串
manacher算法----O(n)最长回文串 分类:字符串 (126) (0) 举报 收藏 manacher的时间复杂度为O(n),后缀数组好像可以处理O(nlogn),但是有些变态题目可能卡 ...
- python【力扣LeetCode算法题库】409-最长回文串(数学 计数器)
最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: 假设字 ...
- 通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)
1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...
- Leetcode69场双周赛-第三题5962. 连接两字母单词得到的最长回文串
5962. 连接两字母单词得到的最长回文串 题目描述 解题思路和解题代码 定义map和sameMap.如果两个字母一样,就看sameMap里面有没有记录,有的话把该记录取出来,结果总数+4,没有的话, ...
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
1. 最长回文串 一般用后缀数组或者后缀树可以解决, 用此方法:http://blog.csdn.net/v_july_v/article/details/6897097 预处理后缀树,使得查询LCA ...
- java 最长回文串_通俗易懂的最长回文串图解、说明及Java代码(中心扩散法和Manacher算法)...
1. 回文串 作为程序员,回文串这个词已经见怪不怪了,就是一个字符串正着读和反着读是一样的,形式如abcdcba.bbaabb.这里涉及到奇回文和偶回文,奇回文指回文串的字符数是奇数,偶回文指回文串的 ...
- 最长回文串--动态规划
最长回文串–动态规划 参考:https://writings.sh/post/algorithm-longest-palindromic-substring class Solution {publi ...
- 1616: 最长回文串(马拉车算法)
1616: 最长回文串 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description 求一个字符串的最长 ...
最新文章
- html判断对错,Html翻转校园试题
- 如何在Cordova Android 7.0.0 以下版本集成最新插件 极光插件为例 1
- .Net Validator验证框架 [ .Net | Validator Framework | Attribute ]
- Mysql 主从复制常用管理任务介绍
- Lvs Tun隧道模式配置
- 开源纯C#工控网关+组态软件(四)上下位机通讯原理
- 26.0.0-alpha1_WildFly 8.0.0.Alpha1的发布和一些历史
- Java之路:this关键字的用法
- gcc 编译python_4 个快速的 Python 编译器 for 2018
- 吴恩达《机器学习》第六章:逻辑回归
- es6中一些基本的使用方法
- python函数手册(1)
- sign-canvas 一个基于canvas开发,封装于Vue组件的通用手写签名板(电子签名板),支持pc端和移动端;
- 计算机平面设计与工程论文,计算机平面设计毕业论文范文2篇
- python 异常 exception_关于Python中异常(Exception)的汇总
- 公众号内测算法推荐引争议,却有小号因此阅读增长20倍
- HANA 存储过程 YTD
- 【算法导论】 二叉搜索树、AVL树、和红黑树
- apiserver 补充 限流认证 以及mutating流程
- “大众点评开发者平台”正式上线
热门文章
- 冒险岛教程一:修改封包加解密(AES_OFB)
- 机器学习之线性回归值预测算法
- 市场调研-乳清酸一水合物市场现状及未来发展趋势
- RSA 实现数据加密解密以及Token管理
- 高等数学-二重积分思维导图
- VS2008 打开程序弹窗:save changes to the following items devenv sln问题
- Activity的生命周期之图记表查
- UVM中Objection的作用
- 图像处理与计算机视觉用c语言吗,即将不再只是图像的CVer,计算机视觉要变天...
- iOS学习之iOS5.0以上 使用新浪微博开放平台OAuth