一起刷LeetCode5-Longest Palindromic Substring
发现自己原来掌握的一下算法,都忘掉了,啊啊啊
------------------------------------------------------------------------------------------------------
Longest Palindromic Substring
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.
【题意】:给你一个字符串,求最长回文字符子串。
【心路历程】:这题一开始我就照着O(n)的方法想,一开始是想扫描一遍字符串,然后递增的处理奇数回文串和偶数回文串的情况。
但是发现对于既可以是奇数回文串也可以是偶数回文串的情况处理不了,比如“aaaa”,“aaa”。于是感觉到自己想歪了。
这题有个O(n)的方法,但是没看懂。。。
一般的方法是O(n*2),有两个大的思路:
一个是枚举回文串中心的位置,然后不断地向两边递增。直到不满足回文串的要求。
一个是动态规划的思想,dp[i][j]表示从i到j字符串是不是回文串,有两个值True ,False。动态转移方程为:
dp[i][j] = ( dp[i+1][j-1] && s[i] == s[j] ).
其实还可以将字符串反转一下,然后求最长连续公共子串。(其实这个是以前我处理最长回文子串常用的方法,但是这次做题已经忘得一干二净了)
动态转移方程为: dp[i][j] = max( dp[i-1][j-1] + (s[i] == s[j]), dp[i-1][j], dp[i][j-1] )
-------------------------------------------------------------------------------------------------------------------------------------------
代码如下:
首先是枚举回文串中心的位置的代码:
1 struct node {
2 int l;
3 int r;
4 };
5 struct node f(char * s,int l,int r,int len) {
6 struct node a;
7 while(l >= 0 && l < len && r >= 0 && r < len && s[l] == s[r]) {
8 l--;
9 r++;
10 }
11 a.l = l + 1;
12 a.r = r - 1;
13 return a;
14 }
15
16 char* longestPalindrome(char* s) {
17 int i,len,l,max = 0;
18 len = strlen(s);
19 char * ans = (char *)malloc(1000*sizeof(char));
20 struct node p;
21 int maxr,maxl;
22 for(i = 0; i < len; i++) {
23 p = f(s,i,i,len);
24 l = (p.r - p.l + 1);
25 if(l > max) {
26 max = l;
27 maxr = p.r;
28 maxl = p.l;
29 }
30 if(i + 1 < len && s[i] == s[i + 1]) {
31 p = f(s,i,i+1,len);
32 l = (p.r - p.l + 1);
33 if(l > max) {
34 max = l;
35 maxr = p.r;
36 maxl = p.l;
37 }
38 }
39 }
40 for(i = 0; i < maxr - maxl + 1; i++) {
41 ans[i] = s[maxl + i];
42 }
43 ans[i] = '\0';
44 return ans;
45 }
然后是dp的代码:
1 char* longestPalindrome(char* s) {
2 int dp[1001][1001];
3 int max = 1,start = 0;
4 char * ans = (char*)malloc(1000*sizeof(char));
5 memset(dp,0,sizeof(dp));
6 int len = strlen(s),i,j;
7 for(i = 0; i < len; i++) {
8 dp[i][i] = 1;
9 }
10 for(i = 0; i < len; i++) {
11 if(i + 1 < len && s[i] == s[i + 1]) {
12 dp[i][i+1] = 1;
13 if(2 > max) {
14 max = 2;
15 start = i;
16 }
17 }
18 }
19 for(i = 3; i <= len ;i++) {
20 for(j = 0; j + i <= len; j++) {
21 if(s[j] == s[j+i-1] && dp[j+1][i+j-2]) {
22 dp[j][j+i-1] = 1;
23 if(i > max) {
24 max = i ;
25 start = j;
26 }
27 }
28 }
29 }
30 for(i = 0; i < max; i++) {
31 ans[i] = s[start + i];
32 }
33 ans[i] = '\0';
34 return ans;
35 }
一起刷LeetCode5-Longest Palindromic Substring的更多相关文章
- leetcode--5. Longest Palindromic Substring
题目来自 https://leetcode.com/problems/longest-palindromic-substring/ 题目:Given a string S, find the long ...
- LeetCode5 Longest Palindromic Substring
题意: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...
- LeetCode-5:Longest Palindromic Substring(最长回文子字符串)
描述:给一个字符串s,查找它的最长的回文子串.s的长度不超过1000. Input: "babad" Output: "bab" Note: "aba ...
- LeetCode5. Longest Palindromic Substring 最长回文子串 4种方法
题目链接:https://leetcode.com/problems/longest-palindromic-substring/ 题意很简单,就是求一个字符串得最长子串,这里的子串指连续的. 本文给 ...
- Leetcode5.Longest Palindromic Substring最长回文字串
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- Leetcode5:Longest Palindromic Substring@Python
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- LeetCode5:Longest Palindromic Substring
题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...
- [Swift]LeetCode5. 最长回文子串 | Longest Palindromic Substring
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- (python)leetcode刷题笔记05 Longest Palindromic Substring
5. Longest Palindromic Substring Given a string s, find the longest palindromic substring in s. You ...
- 刷题5. Longest Palindromic Substring
一.题目说明 Longest Palindromic Substring,求字符串中的最长的回文. Difficuty是Medium 二.我的实现 经过前面4个题目,我对边界考虑越来越"完善 ...
随机推荐
- HUD-1142
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- AOJ 0525 - Osenbei
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=50785 翻译:http://blog.csdn.net/acm_10000h ...
- mvp(1)简介及它与mvc区别
注意:它们是软件架构,不是设计模式 左边mvc 右边mvp MVC和MVP的区别? MVP 是从经典的MVC架构演变而来,它们的基本思想有相通的地方:Controller/Presenter负责 ...
- MTK android flash配置
关于6573集成MCP nandflash的方法,driver_allinone 和Memory Customer Document pdf的说明里面漏了很多细节.在此补上. 1.首先确认flash型 ...
- [HDOJ2830]Matrix Swapping II(胡搞)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2830 给一个矩阵只有0和1,矩阵的列可以和其他列交换无数次,问交换后整个矩阵形成的最大的全是1的子矩阵 ...
- WCF中配置文件解析
WCF中配置文件解析[1] 2014-06-14 WCF中配置文件解析 参考 WCF中配置文件解析 返回 在WCF Service Configuration Editor的使用中,我们通过配置工具自 ...
- Searching in a Radius using Postgres[Marked]
Searching in a Radius using Postgres Creating a GEO application has never been easier. You can have ...
- plsql programming 18 包
所谓包, 就是把一组PL/SQL 的代码元素组织在一个命名空间下. 另外, 包的用法就类似java中的类.( 有封装, 有重载, 没有继承和多肽) create or replace procedur ...
- This project needs to migrate WTP metadata
in command-line: path> mvn eclipse:clean path> mvn -Dwtpversion=1.5 eclipse:eclipse path> m ...
- 漫游Kafka实战篇之搭建Kafka运行环境
接下来一步一步搭建Kafka运行环境. Step 1: 下载Kafka 点击下载最新的版本并解压. > tar -xzf kafka_2.9.2-0.8.1.1.tgz > cd kafk ...