【LeetCode】5. Longest Palindromic Substring 最长回文子串
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
公众号:负雪明烛
本文关键词:最长回文子串,题解,leetcode, 力扣,python, C++, java
题目地址:https://leetcode.com/problems/longest-palindromic-substring/description/
题目描述
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"
题目大意
找出字符串中最长的回文子串。
解题方法
暴力遍历
遍历算法是我们最直观的解法,事实上也能通过OJ。我们使用的方法是两重循环确定子串的起始和结束位置,这样只要判断该子串是个回文,我们保留最长的回文即可。
代码很简单,C++版本如下:
class Solution {
public:
string longestPalindrome(string s) {
const int N = s.size();
string res;
for (int i = 0; i < N; i++) {
for (int j = i; j < N; j++) {
if (j - i + 1 >= res.size() && isPalindrome(s, i, j)) {
res = s.substr(i, j - i + 1);
}
}
}
return res;
}
// [start, end]
bool isPalindrome(string& s, int start, int end) {
const int N = s.size();
int l = start, r = end;
while (l <= r) {
if (s[l++] != s[r--]) {
return false;
}
}
return true;
}
};
动态规划
动态规划的两个特点:第一大问题拆解为小问题,第二重复利用之前的计算结果,来解答这道题。
那如何划分小问题呢,我们可以先把所有长度最短为1的子字符串计算出来,根据起始位置从左向右,这些必定是回文。然后计算所有长度为2的子字符串,再根据起始位置从左向右。到长度为3的时候,我们就可以利用上次的计算结果:如果中心对称的短字符串不是回文,那长字符串也不是,如果短字符串是回文,那就要看长字符串两头是否一样。这样,一直到长度最大的子字符串,我们就把整个字符串集穷举完了。
我们维护一个二维数组 dp
,其中 dp[i][j]
表示字符串区间 [i, j]
是否为回文串。
- 当
i = j
时,只有一个字符,肯定是回文串; - 如果
i = j + 1
,说明是相邻字符,此时需要判断s[i]
是否等于s[j]
; - 如果
i
和j
不相邻,即i - j >= 2
时,除了判断s[i]
和s[j]
相等之外,dp[j + 1][i - 1]
若为真,就是回文串。
通过以上分析,可以写出递推式如下:
dp[i, j] = 1 if i == j
= s[i] == s[j] if j = i + 1
= s[i] == s[j] && dp[i + 1][j - 1] if j > i + 1
Python 代码刚提交的时候超时了,但是使用set一下,看看是否只包含相同字符,这样就通过了!
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if len(set(s)) == 1: return s
n = len(s)
start, end, maxL = 0, 0, 0
dp = [[0] * n for _ in range(n)]
for i in range(n):
for j in range(i):
dp[j][i] = (s[j] == s[i]) & ((i - j < 2) | dp[j + 1][i - 1])
if dp[j][i] and maxL < i - j + 1:
maxL = i - j + 1
start = j
end = i
dp[i][i] = 1
return s[start : end + 1]
C++版本代码如下,需要注意的是这里的res初始化为第一个字符:
class Solution {
public:
string longestPalindrome(string s) {
const int N = s.size();
if (N == 0) return "";
string res = s.substr(0, 1);
vector<vector<bool>> dp(N, vector(N, false));
// s[j, i]
for (int i = 0; i < N; i++) {
for (int j = 0; j < i; j++) {
dp[j][i] = (s[j] == s[i]) && (i == j + 1 || dp[j + 1][i - 1]);
if (dp[j][i] && i - j + 1 >= res.size()) {
res = s.substr(j, i - j + 1);
}
}
dp[i][i] = true;
}
return res;
}
};
二刷—
马拉车算法。。待续
参考:
http://www.cnblogs.com/grandyang/p/4464476.html
https://segmentfault.com/a/1190000002991199
日期
2018 年 3 月 15 日 —— 雾霾消散,春光明媚
2019 年 1 月 19 日 —— 有好几天没有更新文章了
【LeetCode】5. Longest Palindromic Substring 最长回文子串的更多相关文章
- Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法) Given a string s, find the longest pal ...
- [LeetCode] 5. Longest Palindromic Substring 最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- [leetcode]5. Longest Palindromic Substring最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- lintcode :Longest Palindromic Substring 最长回文子串
题目 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文 ...
- 5. Longest Palindromic Substring(最长回文子串 manacher 算法/ DP动态规划)
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- 1. Longest Palindromic Substring ( 最长回文子串 )
要求: Given a string S, find the longest palindromic substring in S. (从字符串 S 中最长回文子字符串.) 何为回文字符串? A pa ...
- 【翻译】Longest Palindromic Substring 最长回文子串
原文地址: http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html 转载请注明出处:http:// ...
- 005 Longest Palindromic Substring 最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
随机推荐
- 在Linux下搭建nRF51822的开发烧写环境(makefile版)
http://www.qingpingshan.com/m/view.php?aid=394836
- linux系统中tomcat的安装及使用
linux系统中tomcat的安装及使用 linux系统中安装tomcat tar.gz/tar文件格式安装 先下载好该文件,将文件放置在校安装的目录下, 如果是tar.gz后缀使用 tar -zxv ...
- 巩固javaweb第十七天
巩固内容: 文本域 文本域主要用于输入多行文字,如果输入的文字比较多,则可以采用文本域. 文本域的基本格式如下: <textarea rows="行数" name=" ...
- 数组的高阶方法map filter reduce的使用
数组中常用的高阶方法: foreach map filter reduce some every 在这些方法中都是对数组中每一个元素进行遍历操作,只有foreach是没有 ...
- angular中路由跳转并传值四种方式
一.路由传值 步骤1 路由传递参数 注意 一定是要传递 索引值 let key = index 这种情况是在浏览器中可以显示对应的参数 这种的是问号 localhost:8080/news?id=2& ...
- ping (网络诊断工具)
Ping是Windows.Unix和Lnix系统下的一个命令,ping也属于一个通信协议,是TCP/IP协议的一部分,利用Ping命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障.应用格 ...
- list通过比较器进行排序
Collections.sort(dataList,new Comparator<BaseTransitData>(){ public int compare(Bas ...
- JSP中声明变量、方法
在JSP页面中声明局部变量,全局变量,方法等 代码示例: <%@ page language="java" contentType="text/html; char ...
- ASP.NET Web API路由解析
前言 本篇文章比较长,仔细思考阅读下来大约需要15分钟,涉及类图有可能在手机显示不完整,可以切换电脑版阅读. 做.Net有好几年时间了从ASP.NET WebForm到ASP.NET MVC再到ASP ...
- Mysql报错合集
目录 一.链接报错 客户端连接mysql出错 链接客户端出错 交互登陆mysql出现warning警告Using a password 导入数据到数据库报错ERROR 1050 登陆数据库提示-bas ...