5. Longest Palindromic Substring (DP)
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
思路:如果不用动态规划,在两个for循环的情况下,还得依次比较i,j间的每个字符,O(n3)。使用动态规划,O(n2)
char* longestPalindrome(char* s) {
int n = strlen(s);
int max = ;
int pStart = ;
bool flag[n][n];
for(int i = ; i < n; i++){
flag[i][i] = true;
for(int j = i+; j < n; j++){
flag[i][j] = false;
}
}
for(int j = ; j < n; j++){ //when iterate j, we should already iterated j-1, 可以理解成j之前已排序好=>用插入排序的顺序遍历
for(int i = ; i < j; i++){
if(s[i]==s[j]){
flag[i][j] = (j==i+)?true:flag[i+][j-];
if(flag[i][j] && j-i+ > max){
max = j-i+;
pStart = i;
}
}
}
}
s[pStart+max]='\0';
return &s[pStart];
}
方法II:KMP+动态规划,时间复杂度在最好情况下达到O(n)

char* preProcess(char* s) {
int n = strlen(s);
if (n == ) return "^$";
char* ret = malloc(sizeof(char)*(n*+));
char* pRet = ret;
*pRet++ = '^'; //开始符^
for (int i = ; i < n; i++){
*pRet++ = '#';
*pRet++ = s[i];
}
*pRet++ = '#';
*pRet = '$';//结束符$
return ret;
}
char* longestPalindrome(char* s) {
char* T = preProcess(s);
int n = strlen(T);
int P[n];
int C = , R = ;
char* ret;
for (int i = ; i < n-; i++) {
int i_mirror = *C-i; // equals to i_mirror = C - (i-C)
//if p[i_mirror] < R-i: set p[i] to p[i_mirror]
if(R>i){
if(P[i_mirror] <= R-i){
P[i] = P[i_mirror];
}
else P[i] = R-i;
}
else P[i] = ;
//else: Attempt to expand palindrome centered at i
while (T[i + + P[i]] == T[i - - P[i]]) //因为有哨兵^$所以不用担心越界; +1, -1检查下一个元素是否相等,若相等,扩大p[i]
P[i]++;
//if the palindrome centered at i does expand past R
if (i + P[i] > R) {
C = i;
R = i + P[i];
}
}
// Find the maximum element in P.
int maxLen = ;
int centerIndex = ;
for (int i = ; i < n-; i++) {
if (P[i] > maxLen) {
maxLen = P[i];
centerIndex = i;
}
}
ret = malloc(sizeof(char)*maxLen+);
strncpy(ret, s+(centerIndex - - maxLen)/, maxLen);
ret[maxLen] = '\0';
return ret;
}
5. Longest Palindromic Substring (DP)的更多相关文章
- leetcode 第五题 Longest Palindromic Substring (java)
Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. You may ...
- Leetcode 之Longest Palindromic Substring(30)
很经典的一道题,最长回文子串,有多种方法. 首先介绍的一种方法是从中间向两边展开.注意区分aba和abba型的回文串:如果当前最长的子串已经当于两边中最长的子串了,则无需再去判断. //从中间向两边展 ...
- LeetCode:5. Longest Palindromic Substring(Medium)
原题链接:https://leetcode.com/problems/longest-palindromic-substring/description/ 1. 题目要求:找出字符串中的最大回文子串 ...
- leetcode:Longest Palindromic Substring(求最大的回文字符串)
Question:Given a string S, find the longest palindromic substring in S. You may assume that the maxi ...
- [LeetCode] Longest Palindromic Substring(manacher algorithm)
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- LeetCode 5 Longest Palindromic Substring(最长子序列)
题目来源:https://leetcode.com/problems/longest-palindromic-substring/ Given a string S, find the longest ...
- LeetCode OJ:Longest Palindromic Substring(最长的回文字串)
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- 21.Longest Palindromic Substring(最长回文子串)
Level: Medium 题目描述: Given a string s, find the longest palindromic substring in s. You may assume ...
- 5.Longest Palindromic Substring (String; DP, KMP)
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
随机推荐
- MonGoDB 在linux 上的安装和配置
01: 下载 linux 版本的二进制包 => https://www.mongodb.com/ 02: 解压 => tar -zxf mongodb-linux-x86_64-3.4. ...
- leetcode1017
这道题目很巧妙,似乎是有些过于巧妙了,属于我未知领域的类型,把原作者的解决方案放这里.(看大家都在给差评,我也顺手给个差评吧--) 参考:https://leetcode.com/problems/c ...
- 关于npm 包的发布
注册一个npm 账号,打开命令行输入 npm add user 然后登录 npm login 发布npm 包,在你要发布的包的目录下,在创建账号后需要认证邮箱,否则无法发布,发布同一个包,每次的版本需 ...
- CentOS 7.0安装配置Vsftp服务器步骤详解
安装Vsftp讲过最多的就是在centos6.x版本中了,这里小编看到有朋友写了一篇非常不错的CentOS 7.0安装配置Vsftp服务器教程,下面整理分享给各位. 一.配置防火墙,开启FTP服务器需 ...
- hadoop搭建部署
HDFS(Hadoop Distributed File System)和Mapreduce是hadoop的两大核心: HDFS(文件系统)实现分布式存储的底层支持 Mapreduce(编程模型)实现 ...
- Nginx ssl证书部署方法
查看当前安装的OpenSSL版本所支持的密码列表,可以使用下列命令:openssl ciphers 苹果ATS检测:https://www.qcloud.com/product/ssl 刚开始&quo ...
- java script删除数组的方法集合(转载)
一.清空数组 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即被清空了 二.删 ...
- split()方法解析
split()方法用于将字符串分割为字符串数组. 废话不多说,直接贴代码: var str="How are you doing today?" console.log(str.s ...
- JAVAWEB 一一 Spirng(AOP面向切面)
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <!-- < ...
- (转)JS之——解决IE6、7、8使用JSON.stringify报JSON未定义错误的问题
https://blog.csdn.net/l1028386804/article/details/53439755 在通过JavaScript将对象类型的参数通过JSON.stringify转换成字 ...