题目

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.

Example:

Input: "cbbd"
Output: "bb"

翻译

回文字符串 即类似 abcba 正读和逆序读是一样的字符串

本题要求最长回文字符子串

Hints

Related Topics: String

回文字符串可以通过递归的方法判断 一开始想到的是通过将原字符串倒置(reverse) 然后求两个字符串的最大公共子串 即是最大回文字符串 但是失策了 如果出现类似 abcdfrcba 就会将 abc 判断为回文字符串(囧)

所以还是遍历字符串 追踪最长回文字符串的长度 每遍历时增加一个字符 那么 maxlen 可能加1或者加2 但不可能加3 所以只需要检查以该字符结尾往前的 maxlen(意味着可能加1) 或者 maxlen-1(意味着可能加2) 个字符组成的字符串是否是回文字符串

至于为什么不能加3 证明如下:

如果现在的maxlen=3 现在遍历到字符 a
1. 我们检查 ×××a 如果是回文字符串 maxlen+1 = 4
2. 我们检查 ××××a 如果是回文字符串 maxlen+2 = 5
3. 不检查 xxa 这样回文字符串长度没有增加
4. 不检查 ×××××a 因为如果它是回文字符串 那么必是 a××××a 中间的 ×××× 也是回文字符串 maxlen 是 4 而不是 3

代码

Java

//原理是相同的
class Solution {
int maxlen, lo;
public String longestPalindrome(String s) {
int len = s.length();
if(len<2) return s; for(int i=0;i<len-1;i++){
extendPalindrome(s, i, i);
extendPalindrome(s, i, i+1);
}
return s.substring(lo,lo+maxlen);
}
public void extendPalindrome(String s,int start, int end){
while(start>=0 && end<s.length() && s.charAt(start)==s.charAt(end)){
start--;
end++;
}
if(maxlen<end-start-1){
lo = start+1;
maxlen = end-start-1;
} }
}

Python

class Solution(object):
def judge(self, s, start, end):
if start<0: return False
while start<end:
if s[start]==s[end]:
start += 1
end -= 1
else:
return False
return True
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
maxlen = 0
res = '' for i in range(len(s)):
if self.judge(s, i-maxlen-1, i):
res = s[i-maxlen-1:i+1]
maxlen += 2
elif self.judge(s, i-maxlen,i):
res = s[i-maxlen:i+1]
maxlen += 1
return res

最新文章

  1. java 引入自定义字体font后出现的硬盘吃光的问题
  2. POJ 1459:Power Network(最大流)
  3. [转]Redis之七种武器
  4. 【openGL】画五角星
  5. 周赛-KIDx&#39;s Pagination 分类: 比赛 2015-08-02 08:23 7人阅读 评论(0) 收藏
  6. 2016年7月2日 星期六 --出埃及记 Exodus 14:29
  7. 关于android:inputType属性的说明
  8. Android 系统的四层结构
  9. php curl模拟post请求提交数据
  10. 一款C++静态分析工具 —— CppDepend
  11. 完整版ajax+百度echarts实现统计图表demo并随着窗口大小改变而自适应
  12. 2017-2018-1 Java演绎法 小组成员贡献量汇总
  13. 在PL/SQL中调用Oracle存储过程
  14. JavaScript原型(第五天)
  15. asp微信支付代码v4.1无需证书版,带回调入库的asp支付源码
  16. Netty精粹之轻量级内存池技术实现原理与应用
  17. 查看Windows系统里的进程已运行的时间
  18. linux md5sum命令
  19. 变量与算术表达式 - C程序设计语言
  20. Android 从 Android 本地图库选择多个图片

热门文章

  1. 2017-2018-1 20155207&amp;20155308《信息安全技术》实验四-木马及远程控制技术
  2. jQuery学习-基本选择器
  3. 使用Nginx+uWSGI+Django方法部署Django程序
  4. 洛谷 P4018 Roy&amp;October之取石子
  5. 【转载】怎样在C++工程中集成C#窗口
  6. 一维码EAN 13简介及其解码实现(zxing-cpp)
  7. 24-[模块]-re
  8. [BZOJ4476][JSOI2015]送礼物[分数规划+单调队列]
  9. 菜鸟vimer成长记——第2.0章、模式初探
  10. 用html+css做机器猫 源代码