一起刷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 }
时间: 2024-10-22 17:11:29

一起刷LeetCode5-Longest Palindromic Substring的相关文章

LeetCode5 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. 给一个String串,求其中最大的回文字串.这是一个典型的最长回文子串问题,目前有四种解法. 1.暴力测试,测试每个子串,显然这样是最笨的方法,

[Java]LeetCode5 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. 题意:求字符串中最长的回文 感觉这题不难,可以这样想,设置两个指针,分别对应0,len-1. 比如从第一个字符开始,abababac,我们可以找a出现

LeetCode-5. Longest Palindromic Substring(M)

解法 比较经典的问题,寻找最长回文子串.Leetcode里提供了多种解法.我采用最直观的解法:中心扩展法. 思路是每次以当前元素为中心向两边扩展,直到遇到不同元素,此时找到一个子串.有两点需要注意的地方: 1)空串和单字符都是回文,直接返回即可. 2)偶数回文和奇数回文的情况.例如:abace是aba的奇数串,以b为中心向两周扩展即可.但是abbawe是偶数串abba,这样需要以bb为指针向两周同时往外扩展. Given a string s, find the longest palindro

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

描述:给一个字符串s,查找它的最长的回文子串.s的长度不超过1000. Input: "babad" Output: "bab" Note: "aba" is also a valid answer. 我是采用动态规划解决此题的.官方的solutions中提供了几种思路,包括我使用的DP.这里摘要如下: 思路1: 将s反转得到s',然后查找s和s'的最长公共子串substring,那么substring就是最长回文子串.比如:s = "

LeetCode5: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. 解题思路: 主要有三种: 第一种:Manacher算法,也是最快的,时间复杂度为O(n) 第二种:DP算法,时间复杂度为O(n*n) 第三种:

刷题5. Longest Palindromic Substring

一.题目说明 Longest Palindromic Substring,求字符串中的最长的回文. Difficuty是Medium 二.我的实现 经过前面4个题目,我对边界考虑越来越"完善"了. 总共提交了5次: 第1.2次:Wrong Answer 主要是"cbbd"错误了,重复的判断逻辑上出了点小问题 第3.4次: Time Limit Exceeded 我本地代码运行没问题的,但是提交后,报错.给了一个超长的用例: 321012321001232100123

LeetCode OJ: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. 玩了两天dota2,罪过罪过,还是应该老老实实刷题啊. 题目求得是最长的回文子串,这里使用的是暴力的解法,也就是解决两种回文"asdsa"以

[string]Longest Palindromic Substring

Total Accepted: 82026 Total Submissions: 379898 Difficulty: Medium 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. Subscrib

5. Longest Palindromic Substring - Unsolved

https://leetcode.com/problems/longest-palindromic-substring/#/description Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example: Input: "babad" Output: "bab" Note: &

[Leetcode] 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. 做这道题之前要先了解什么是回文子串.回文串通俗的解释是,分别从字符串两端开始遍历,得到的结果相同,如"abba",从两端的遍历结果都是:&q