蜗牛慢慢爬 LeetCode 5.Longest Palindromic Substring [Difficulty: Medium]
2024-10-15 11:57:18
题目
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
最新文章
- java 引入自定义字体font后出现的硬盘吃光的问题
- POJ 1459:Power Network(最大流)
- [转]Redis之七种武器
- 【openGL】画五角星
- 周赛-KIDx&#39;s Pagination 分类: 比赛 2015-08-02 08:23 7人阅读 评论(0) 收藏
- 2016年7月2日 星期六 --出埃及记 Exodus 14:29
- 关于android:inputType属性的说明
- Android 系统的四层结构
- php curl模拟post请求提交数据
- 一款C++静态分析工具 —— CppDepend
- 完整版ajax+百度echarts实现统计图表demo并随着窗口大小改变而自适应
- 2017-2018-1 Java演绎法 小组成员贡献量汇总
- 在PL/SQL中调用Oracle存储过程
- JavaScript原型(第五天)
- asp微信支付代码v4.1无需证书版,带回调入库的asp支付源码
- Netty精粹之轻量级内存池技术实现原理与应用
- 查看Windows系统里的进程已运行的时间
- linux md5sum命令
- 变量与算术表达式 - C程序设计语言
- Android 从 Android 本地图库选择多个图片
热门文章
- 2017-2018-1 20155207&;20155308《信息安全技术》实验四-木马及远程控制技术
- jQuery学习-基本选择器
- 使用Nginx+uWSGI+Django方法部署Django程序
- 洛谷 P4018 Roy&;October之取石子
- 【转载】怎样在C++工程中集成C#窗口
- 一维码EAN 13简介及其解码实现(zxing-cpp)
- 24-[模块]-re
- [BZOJ4476][JSOI2015]送礼物[分数规划+单调队列]
- 菜鸟vimer成长记——第2.0章、模式初探
- 用html+css做机器猫 源代码