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

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

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. Android HTTPS(4)直接用SSLSocket,黑名单,客户端证书

    Warnings About Using SSLSocket Directly So far, the examples have focused on HTTPS using HttpsURLCon ...

  2. hadoop环境搭建笔记

    一.配置Linux (1)cat /etc/networks (2)cat /etc/sysconfig/network (3)vi /etc/udev/rules.d/70-persistent-n ...

  3. 使用multimap创建重复键关联容器

    在“使用 <map> 库创建关联容器”一文中,我们讨论了标准库中的 map 关联容器.但那只是 map 容器的一部分.标准库还定义了一个 multimap 容器,它与 map 类似,所不同 ...

  4. cocos2dx 坐标系 -转

    (原文出处找不到了) 无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥奔头了.所以玩cocos2d,一上来就先把各种与坐标有关的东西搞清楚. 基本的两个坐标系:屏幕坐标系和GL ...

  5. bzoj4026

    直接按照欧拉函数的计算方式来即可 φ=区间积*区间出现(质数-1)的积/区间出现过的质数的积 区间积是满足类似区间减法的操作的(利用逆元) 由于强制在线,上主席树就可以了(维护每个质数上次出现的位置p ...

  6. 64位Ubuntu 13.04 安装Bochs 2.3.5

    bochs 2.3.5源码编译 网上编译bochs的资料非常多,基本的问题都有解决方案,我重点讲不常见的问题. 基本安装步骤 tar vxzf bochs-2.3.5.tar.gz cd bochs- ...

  7. js之dom_2

    动态脚本1 载入脚本文件 var s = document.createElement("script"); s.src = "test2.js"; s.typ ...

  8. UVa401 回文词

    Palindromes A regular palindrome is a string of numbers or letters that is the same forward as backw ...

  9. UISegment

    UISegment分段控制 属性 1.segmentedControlStyle 设置segment的显示样式. typedef NS_ENUM(NSInteger, UISegmentedContr ...

  10. Npoi Web 项目中(XSSFWorkbook) 导出出现无法访问已关闭的流的解决方法

    原本在CS项目中用的好好的在BS项目中既然提示我导出出现无法访问已关闭的流的解决方法 比较郁闷经过研究 终于解决了先将方法发出来 让遇到此问题的筒子们以作参考 //新建类 重写Npoi流方法 publ ...