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

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

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. 《Linux内核设计与实现》读书笔记(十)- 内核同步方法【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/01/3052865.html 内核中提供了多种方法来防止竞争条件,理解了这些方法的使用场景有助于我 ...

  2. Tmall发送码asp验证sing(自有码开发)

    <%''查询通知应答类'============================================================================'api说明:'g ...

  3. c#换ip代理源码

    很多朋友都想如何提高自己的网站流量,可是都没有什么好的办法 经过很长时间的研究,在C#中实现了,当然了,这部分代码其中一部分是网上的,不是原创. using System; using System. ...

  4. 终于成功仿了一次Kalman滤波器

    终于成功仿了一次Kalman滤波器 首先是测试了从网上down的一段代码 % KALMANF - updates a system state vector estimate based upon a ...

  5. [Android] Android开发优化之——使用软引用和弱引用

      Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. ...

  6. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...

  7. Sass中的mixin,function,extend

    Mixins: 用于相类似的css属性将会被使用多次,每次调用时仅仅有小的参数改变: Function 用于计算得出相关值: Extend 有一批属性完全匹配时,应该使用extend

  8. 1038: [ZJOI2008]瞭望塔

    半平面交. 半平面指的就是一条直线的左面(也不知道对不对) 半平面交就是指很多半平面的公共部分. 这道题的解一定在各条直线的半平面交中. 而且瞭望塔只可能在各个点或者半平面交折线的拐点处. 求出半平面 ...

  9. android studio sqlite操作代码片段

    SQLiteDatabase db;Cursor cur; SimpleCursorAdapter adapter;   // 打开或创建数据库db = openOrCreateDatabase(DB ...

  10. mysql-备份和还原(普通还原和binlog还原)

    1)备份 mysqldump -uroot -proot share -l -F > /tmp/share.sql 说明:-l 锁表 -F 刷新日志文件(相当于flush logs) 2)还原( ...