leetcode-5 最长回文子串(动态规划)

题目要求:

* 给定字符串,求解最长回文子串
* 字符串最长为1000
* 存在独一无二的最长回文字符串

求解思路:

* 回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文字符串,
* 那么P[i+1,j-1]也是回文字符串。这样最长回文子串就能分解成一系列子问题了。
* 这样需要额外的空间O(N^2),算法复杂度也是O(N^2)。
* 首先定义状态方程和转移方程:
* P[i,j]=0表示子串[i,j]不是回文串。P[i,j]=1表示子串[i,j]是回文串。
* P[i,i]=1
* P[i,j]{=P[i+1,j-1],if(s[i]==s[j])
* =0 ,if(s[i]!=s[j])}

代码:

 1     public static String longestPalindrome(String s){
 2         if(s == null || s.length() == 1){
 3             return s;
 4         }
 5         int len = s.length();
 6         //flag[i][j]=true 表示子串i-j为回文字符串
 7         boolean[][] flags = new boolean[1000][1000];
 8         int start = 0;
 9         int maxlen = 0;
10         for(int i=0; i<len; i++){
11             flags[i][i] = true;
12             //相邻的两个字符相同
13             if( i<len-1 && s.charAt(i) == s.charAt(i+1)){
14                 flags[i][i+1] = true;
15                 start = i;
16                 maxlen = 2;
17             }
18         }
19
20         //m代表回文子串长度,从3开始
21         for(int m = 3; m <= len; m++){
22             for(int i = 0; i <= len-m; i++ ){
23                 //依次比较是否符合状态转移方程
24                 int j = i+m-1;
25                 if(flags[i+1][j-1] && s.charAt(i)==s.charAt(j)){
26                     flags[i][j] = true;
27                     start = i;
28                     maxlen = m;
29                 }
30             }
31         }
32
33         //如果存在回文子字符串
34         if(maxlen >=2 ){
35             return s.substring(start, start+maxlen);
36         }
37         //不存在则返回null
38         return null;
39     }
时间: 2024-10-22 22:23:00

leetcode-5 最长回文子串(动态规划)的相关文章

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

题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案. 示例 2: 输入: "cbbd" 输出: "bb"  解法一 遍历字符串,以每个字母为中心,向两边扩散查找,记录当前最长的回文子串的长度和起始位置.结尾位置.时间复杂度O(n^2) 注意: ①当剩下的字符串长度小于当前m

leetcode 5 最长回文子串问题

题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案.示例 2: 输入: "cbbd"输出: "bb" 方法一暴力求解: 定义一个n*n维的数组flage,flage[i][j] 表示以i开始,以j结束的回文串的长度,如果Si,,,,,,Sj是回文串,那么flage[i][

LeetCode -- 5 -- 最长回文子串

给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案. 示例 2: 输入: "cbbd" 输出: "bb" std::string longestPalindrome(std::string s) { const int len = s.size(); if(1 >= len)

[LeetCode系列] 最长回文子串问题

给定字符串S, 找到其子串中最长的回文字符串. 反转法: 反转S为S', 找到其中的最长公共子串s, 并确认子串s在S中的下标iS与在S'中的下标iS'是否满足式: length(S) = iS + iS' + length(s). 如果满足则s为搜索结果, 如果不满足我们就继续搜索. DP解法: 定义 P[i][j] = true  <-> Si...Sj是回文串, 否则为false; 则有 P[i+1][j-1] = true && Si = Sj <-> P[

【Leetcode】最长回文子串

中心扩散法 我们观察到回文中心的两侧互为镜像.因此,回文可以从它的中心展开,并且只有 2n−1 个这样的中心. 你可能会问,为什么会是 2n−1 个,而不是 n 个中心?原因在于所含字母数为偶数的回文的中心可以处于两字母之间(例如“abba” 的中心在两个‘b’ 之间). 时间复杂度 O(n^2), 由于围绕中心来扩展回文会耗去 O(n) 的时间,所以总的复杂度为 O(n^2); 空间复杂度 O(1); 执行用时 : 128 ms, 在Longest Palindromic Substring的

【数据结构与算法】动态规划——最长回文子串

最长回文子串 LeetCode:最长回文子串 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 思想: 动态规划,用boolean[][] dp记录每一对字符是否相等: 双循环遍历所有子串情况,每次遍历时,当前子串首尾相等且内层-1字符串dp值为true,则记录dp值为true:全部遍历完,取最长,即为最

【LeetCode】5# 最长回文子串

题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2: 输入: "cbbd" 输出: "bb" 思路 本题运用了一些动态规划的思想,关于动态规划,可以看看我之前的一篇博客了解一下. LeetCode 探索初级算法 - 动态规划 1.首先要找到最简情况.这道题

[C++]LeetCode: 99 Longest Palindromic Substring (最长回文子串)

题目:Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 思路:题目要求的s的一个最长回文子串.暴力解决办法就是枚举所有的子串,再对每个子串进行回文判断.进行剪枝,我们考虑可以使用动态规划来避免重复的判

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

本文转自:http://www.cnblogs.com/TenosDoIt/p/3675788.html 题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 求字符串的最长回文子串 算法1:暴