一起刷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个题目,我对边界考虑越来越"完善 ...
随机推荐
- C#基础(二)
变量的命名规则: 1.变量名由字母,数字 ,下划线组成.@ 中文 2.首字母,不能是数字 3.不能与关键字重名 变量的定义 语法: 数据类型 变量名[=值]; int a; //只定义变量 ...
- eclipse中maven项目部署到tomcat
其实maven项目部署到tomcat的方式很多,我从一开始的打war包到tomcat/webapps目录,到使用tomcat-maven插件,到直接使用servers部署,一路来走过很多弯路. 下面就 ...
- Maven POM.xml详解[转]
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- Charles是Mac的Fiddler抓包工具
windows下面我们经常使用 Fiddler 抓包工具进行代理等一系列操作.然而,在 Mac 下的 Fiddler 勉强能运行,但是其挫的都不想说它了.今天看到朋友推荐这款 Charles Mac下 ...
- hibernate.cfg.xml文件的说明
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...
- 【Todo】Kerberos、OpenSSL、OAuth2.0等一系列验证权限安全相关学习
Kerberos可以先从这一篇开始: http://idior.cnblogs.com/archive/2006/03/20/354027.html
- 推荐 10 款最好的 Python IDE
简述 Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE ...
- Quickhit快速击键
一.项目分析 根据输入速率和正确率将玩家分为不同等级,级别越高,一次显示的字符数越多,玩家正确输入一次的得分也越高.如果玩家在规定时间内完成规定次数的输入,正确率达到规定要求,则玩家升级.玩家最高级别 ...
- 瞎折腾之 NHibernate ORM框架的接触(MVC + Repository源码)(一)
在这炮火连天.技术更新迅猛的年代,不接触了解.甚至会用2~3种框架都不好意思说自己有多少年工作经验.况且出去面试也会有点吹牛的底子嘛. 这次折腾了NHibernate.其实这些ORM框架封装好了都是给 ...
- WebForm页面运行机制
阅读目录 开始 WebForm前台与后台的关系及运行原理 前台页面 <% @ Page Language="C#" AutoEventWireup="true&qu ...