明天就要上课了,再过几天又要见班主任汇报项目进程了,什么都没做的我竟然有一种迷之淡定,大概是想体验一波熬夜修仙的快乐了。不管怎么说,每天还是要水一篇博文,写一个LeetCode的题才圆满。

题目: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: "aba" is also a valid answer.

第一想法是遍历的过程用堆栈做,想了半天觉得脑子一片空白,放弃,之后看了solution,提到了动态规划,有了想法。太久没刷题了。。。

class Solution {
public:
string longestPalindrome(string s) {
bool flags[s.size()][s.size()]; //flags[i][j]为true,表示s[i]到s[j]位回文子串
for(int i =;i<s.size();i++){
for(int j = ; j< s.size();j++){
flags[i][j] = (i==j )? true:( j == i+? (s[i]==s[j]):false);
}
}
int longest = ; //标记最长回文子串的长度
int start = ; //标记最长回文子串的起始位置
for(int i = ; i<s.size()-;i++){ //寻找有没有bb这样的回文串,然后更新longest和start
if (flags[i][i+] == true){
longest = ;
start = i;
break;
}
}
for(int i = s.size()-; i>=;i--){
for (int j = i+; j < s.size(); j++){
if(s[i]==s[j]&&flags[i+][j-]==true){
flags[i][j] = true;
longest = longest>(j-i+)?longest:(j-i+);
start = longest>(j-i+)?start:i;
}
}
}
return s.substr(start,longest);
}
};

提交之后96ms,击败20%。这么慢,我要哭了。O(n2)的时间复杂度和空间复杂度。继续看solution。。。

从中心扩充:这个解法时间复杂度为O(n2),但是空间复杂度为O(1)

每一个回文子串都含有一个中心,因此一个长度为n的字符串,含有2n-1个回文子串的中心,因为回文子串的中心可以是字母,可以是空白,比如aba、aa。

出去浪了一把,代码没写完,明天补上~不能保卫祖国,就好好学习报效祖国吧。

好了,今天来补代码吧。23ms,击败了42%。写代码的时候干了一件傻事,每次找到回文子串要更新三个参数,因为三个参数不是一开始就设置好的,最后加了一个参数flag,想都没想直接在longest之后添加了flag的更新,导致flag不正确,结果错误。这个逻辑错误也是我经常犯的,今后一定要注意参数的更新顺序是否正确。

class Solution {
public:
string longestPalindrome(string s) {
int longest = 0; //回文中心到边缘的长度
int center = 0;
int i = 1;
bool flag = true; //标记回文子串的中心是字母还是空,true为字母
while(i<=s.size()-1){
int j = 1,now = 0;
while(i-j>=0 && s[i+j] == s[i-j] && i+j <s.size()){ //寻找类似于ABA的回文子串
now++;
j++;
}
center = now>=longest?i:center;
       flag = now>=longest?true:flag;
longest = now>=longest?now:longest; //now == longest的时候也要更新子串,因为aba和aa的longest都为1,但是aba比aa长 j = 1;
now = 0;
while(s[i-j]==s[i+j-1] && i-j>=0 && i+j-1<s.size()){ //寻找类似于AA这样的回文子串
now++;
j++;
}
center = now>longest?i:center;
       flag = now>longest?false:flag;
longest = now>longest?now:longest;
i++;
}
return flag?s.substr(center-longest,2*longest+1):s.substr(center-longest,2*longest);
}
};

  看了3ms的答案,发现了一个小trick,就是i的更新不用每次都+1,可以直接把i,也就是回文子串的中心更新成回文子串的最右边,因为不存在以原回文子串的中心到右边的任一位置为中心的回文子串长度长与原子串。还有可以用start和len来代替center、longest、flag三个参数,start表示回文开始,len代表回文长度。

C++ leetcode Longest Palindromic Substring的更多相关文章

  1. [LeetCode] Longest Palindromic Substring 最长回文串

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

  2. Leetcode Longest Palindromic Substring

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

  3. [LeetCode] Longest Palindromic Substring(manacher algorithm)

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

  4. Leetcode: Longest Palindromic Substring && Summary: Palindrome

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

  5. LeetCode:Longest Palindromic Substring 最长回文子串

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

  6. Leetcode: Longest Palindromic Substring. java

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

  7. LeetCode——Longest Palindromic Substring

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

  8. [LeetCode]Longest Palindromic Substring题解(动态规划)

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

  9. Leetcode:Longest Palindromic Substring分析和实现

    问题大意是在给定字符串中查找最长的回文子串,所谓的回文就是依据中间位置对称的字符串,比如abba,aba都是回文. 这个问题初一看,非常简单,但是会很快发现那些简单的思路都会带来O(n^3)级别的时间 ...

随机推荐

  1. springboot整合thymeleaf+tiles示例

    网上关于此框架的配置实在不多,因此想记录下来以防忘记 因为公司框架基于上述(公司采用gradle构建项目,楼主采用的是maven),所以楼主能少走些弯路: 1.创建springboot-maven项目 ...

  2. C# 防止窗体闪烁

    protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle ...

  3. Node前后端分离基本概括

    首先从一个重要的概念“模板”说起. 广义上来说,web中的模板就是填充数据后可以生成文件的页面. 严格意义上来说,应该是模板引擎利用特定格式的文件和所提供的数据编译生成页面.模板大致分为前端模板(如e ...

  4. ssh连接服务器

    1.命令行操作 第一步输入  :ssh 用户名@服务器外网ip 第二步:输入密码,回车 看到welcome提示信息即为登陆成功 输入:exit 退出 2.客户端操作 windows下载ssh软件,安装 ...

  5. python字符串用法

    一,数据类型的转换 1常用的数据类型有int,str,bool三种; int是整型:一般的操作是查找数据的二进制长度bit_length() 一般数据有: 1)二进制:逢二进一 2)十进制,(0-9) ...

  6. django Admin文档生成器

    Django的admindocs应用可以从模型.视图.模板标签等地方获得文档内容. 一.概览 要激活admindocs,请按下面的步骤操作: 在INSTALLED_APPS内添加django.cont ...

  7. 借助JCharDet获取文件字符集

    前段时间,在学习lucene的时候,遇到了读取txt文档遇到编码错误的问题.学了几个解决方案,大部分是将文件转十六进制(可以使用UE的Ctrl+H来查看),读取开头的四个标志位来判断.可是总有些文本文 ...

  8. 能改变this各种情况下的总结,还有没有总结到的,请留言!!

    1.. 在函数参数中的,回调函数的this ,指向window 如: promise中的回调函数, 可以在方法外,转存this 2..构造函数中,this指向,实例对象  , 在全局中this是win ...

  9. Python Selenium 文件上传之SendKeys

    昨天写了Web 文件下载的ui自动化,下载之后,今天就要写web 文件上传的功能了. 当然从折腾了俩小时才上传成功.下面写一下自己操作的步骤 首先网上说的有很多方法 如 input 标签的最好做了,直 ...

  10. learn python the hard way 习题18~25总结

    定义函数和调用函数的语法 定义函数 形式: def functionName(p1,p2): statement other statement 需要注意: 紧跟者函数定义的代码是否使用了4个空格的缩 ...