发现自己原来掌握的一下算法,都忘掉了,啊啊啊

------------------------------------------------------------------------------------------------------

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的更多相关文章

  1. leetcode--5. Longest Palindromic Substring

    题目来自 https://leetcode.com/problems/longest-palindromic-substring/ 题目:Given a string S, find the long ...

  2. LeetCode5 Longest Palindromic Substring

    题意: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  3. LeetCode-5:Longest Palindromic Substring(最长回文子字符串)

    描述:给一个字符串s,查找它的最长的回文子串.s的长度不超过1000. Input: "babad" Output: "bab" Note: "aba ...

  4. LeetCode5. Longest Palindromic Substring 最长回文子串 4种方法

    题目链接:https://leetcode.com/problems/longest-palindromic-substring/ 题意很简单,就是求一个字符串得最长子串,这里的子串指连续的. 本文给 ...

  5. Leetcode5.Longest Palindromic Substring最长回文字串

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

  6. Leetcode5:Longest Palindromic Substring@Python

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  7. LeetCode5:Longest Palindromic Substring

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

  8. [Swift]LeetCode5. 最长回文子串 | Longest Palindromic Substring

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  9. (python)leetcode刷题笔记05 Longest Palindromic Substring

    5. Longest Palindromic Substring Given a string s, find the longest palindromic substring in s. You ...

  10. 刷题5. Longest Palindromic Substring

    一.题目说明 Longest Palindromic Substring,求字符串中的最长的回文. Difficuty是Medium 二.我的实现 经过前面4个题目,我对边界考虑越来越"完善 ...

随机推荐

  1. Hibernate 异常 —— Unable to instantiate default tuplize

    出现这个异常 —— Unable to instantiate default tuplizer ,是 Hibernate 的映射文件(*.hbm.xml)导致的.仔细检查一下工程里的映射文件吧. 笔 ...

  2. 谈谈Perforce

    实习就要结束了,收获之一就是学会了使用Perforce! Perforce SCM System是一款构建于可伸缩客户/服务器结构之上的软件配置管理工具.仅仅应用 TCP/IP,开发人员就能够通过多种 ...

  3. leetcode:Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  4. 函数lock_rec_create

    /*********************************************************************//** Creates a new record lock ...

  5. HDU 1847 (博弈 找规律) Good Luck in CET-4 Everybody!

    为了提高题解质量还是简单证明一下:3的倍数是必败状态. 如果n % 3 = 1,那么拿走1个石子:如果n % 3 = 2,那么拿走两个石子,都将转移到3的倍数的状态.所以每个必胜状态都有一个后继是必败 ...

  6. UVa 424 Integer Inquiry

    之前杭电上也做过a + b的高精度的题,不过这道题的区别是有多组数据. 之前做的时候开了3个字符数组a,b,c,在计算的时候还要比较a,b长度,短的那个还要加'0',还设置了一个add来存放进位. 现 ...

  7. 14.Object-C--浅谈Foundation框架字符串NSString 与NSMutableString

    OC的字符串时经常使用到的,今天我对于OC字符串做一个简单的总结,如果有错误之处,麻烦留言指正.感谢! NSString是一个不可变长度的字符串对象.表示它初始化以后,你不能改变该变量所分配的内存中的 ...

  8. zipline

    history 多只股票时会返回某几只股票停牌没数据 if not symbol(stock) in data: 聚宽 多只股票如果某几只没有发行 600485: nan 多只股票如果某几只停牌 60 ...

  9. (转)每天一个Linux命令(4): mkdir

    http://www.cnblogs.com/peida/archive/2012/10/25/2738271.html linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前 ...

  10. (六)6.16 Neurons Networks linear decoders and its implements

    Sparse AutoEncoder是一个三层结构的网络,分别为输入输出与隐层,前边自编码器的描述可知,神经网络中的神经元都采用相同的激励函数,Linear Decoders 修改了自编码器的定义,对 ...