明天就要上课了,再过几天又要见班主任汇报项目进程了,什么都没做的我竟然有一种迷之淡定,大概是想体验一波熬夜修仙的快乐了。不管怎么说,每天还是要水一篇博文,写一个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. 基于 Python 和 Pandas 的数据分析(3) --- 输入/输出 基础

    这一节, 我们要讨论 Pandas 的输入与输出, 并且应用在现实的实际例子中. 为了得到大量的数据, 向大家推荐一个网站 Quandl. Quandl 有很多免费和付费的资源. 这个网站最大的优势在 ...

  2. 【BZOJ】1830: [AHOI2008]Y型项链

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1830 直接枚举目标串是什么,目标串一定是三个字符串的某一个前缀(注意可能为空),然后判断一 ...

  3. P1547 Out of Hay

    传送门     练习 只是一个最小生成树的水题,拿来练练模板 AC代码: #include<iostream> #include<cstdio> #include<alg ...

  4. IIS上部署MVC网站,打开后ExtensionlessUrlHandler-4.0

    IIS上部署MVC网站,打开后ExtensionlessUrlHandler-Integrated-4.0解决方法IIS上部署MVC网站,打开后500错误 IS上部署MVC网站,打开后Extensio ...

  5. [osg]osg窗口显示和单屏幕显示

    osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("cow.osg"); osg::ref_ptr&l ...

  6. AFM(3)---Maude使用说明

    load file-name 1可用绝对路径 2.可进入maude文件所在目录下load 3.默认工作空间是什么?

  7. Linux 安装SSH

    ●centOS/redhat安装SSH 查询openssh server服务状态:systemctl status sshd 安装sshd命令: yum install openssh-server ...

  8. AtCoder Beginner Contest 110 D - Factorization

    D - Factorization 思路:把相同的质因子看成相同的小球,求把这些小球放进n个盒子里的方案数. 代码: #pragma GCC optimize(2) #pragma GCC optim ...

  9. 算法笔记--斜率优化dp

    斜率优化是单调队列优化的推广 用单调队列维护递增的斜率 参考:https://www.cnblogs.com/ka200812/archive/2012/08/03/2621345.html 以例1举 ...

  10. JAVA基础知识总结:十三

    测试用一个字符串常量创建一个字符串对象 1.获取这个字符串的长度 2.获取任意长度的子串 3.判断这个字符串是否为空 4.将这个字符串中的小写字母转化为大写字母 5.获取某个字符在字符串中第一次出现的 ...