最长回文子串-动态规划O(N^2)
2017-02-13 17:39
190 查看
分析:定义二维数组dp[i,j]用以表示Si…Sj是回文(true)或不是回文(false)
定义dp数组全为false;
第一次循环设置单个字符为回文子串 dp[i][i]=true;
第二次循环判断相邻两个字符dp[i][i+1]是否为回文,若是则将回文子串的起始位置设为i,长度设为2;
第三次循环判断长度len为3到s.length()长度的子串是否为回文,j=i+len-1,dp[i][j] = (dp[i+1][j-1] && Si ==Sj),若成立修改回文串的长度,若新的回文串长度大于原始长度,则修改回文子串的起始位置。
DP法的思路就是,首先判断单个字符和两个相邻字符是否回文,然后检测连续三个字符是否回文,然后四个直到整个字符串是否为回文。
定义dp数组全为false;
第一次循环设置单个字符为回文子串 dp[i][i]=true;
第二次循环判断相邻两个字符dp[i][i+1]是否为回文,若是则将回文子串的起始位置设为i,长度设为2;
第三次循环判断长度len为3到s.length()长度的子串是否为回文,j=i+len-1,dp[i][j] = (dp[i+1][j-1] && Si ==Sj),若成立修改回文串的长度,若新的回文串长度大于原始长度,则修改回文子串的起始位置。
DP法的思路就是,首先判断单个字符和两个相邻字符是否回文,然后检测连续三个字符是否回文,然后四个直到整个字符串是否为回文。
#include <iostream> #include <string> using namespace std; class Solution { public: string longestPalindrome(string s) { int n = s.length(); int beg=0, maxlen=1; int i, j; if(n == 1) return s; //定义动态规划数组 bool dp ; for(i=0; i<n; i++) //当i==j 时,只有一个字符的字符串; 当 i > j 认为是空串,也是回文 for(j=0; j<n; j++) { if(i >= j) dp[i][j] = true; else dp[i][j] = false; } for(i=0; i<n-1; i++) { if(s[i] == s[i+1]) //2个字符为回文串 { dp[i][i+1] = true; beg = i; maxlen = 2; } } for(int len=3; len<=n; len++) for(i=0; i<n-len+1; i++) { j = i+len-1; if(s[i] == s[j] && dp[i+1][j-1]) { dp[i][j] = true; if(maxlen < len) beg = i; maxlen = len; } } return s.substr(beg, maxlen); } }; int main() { Solution S; string tar="babab"; cout<<S.longestPalindrome(tar)<<endl; return 0; }
相关文章推荐
- [动态规划]最长回文子串
- 【C】动态规划--最大连续子序列和/最长不下降子序列/最长公共子序列/最长回文子串/DAG最长路
- 夕拾算法进阶篇:16)最长回文子串(动态规划DP)
- 最长回文子串—动态规划和Manacher算法(0(n)时间复杂度
- [置顶] 【动态规划】求最长公共子串,最长回文子串
- 动态规划 - 最长公共子序列 - 最长公共子串 - 最长不重复子串 - 最长递增子序列 - 最长回文子串
- 最长回文子串 动态规划
- hihoCoder第一周(最长回文子串)
- manacher求最长回文子串算法模板
- C语言最长回文子串
- 最长回文子串(Longest Palindromic Substring)
- SGU 411Petya the Hero(最长公共回文子串,AC自动机+n^2判断回文)(学习后缀数组的前奏)
- 计算字符串的最长回文子串 :Manacher算法介绍
- 最长回文子串 【朴素算法(枚举)】
- 最长回文子串
- 实用算法实现-第 8 篇 后缀树和后缀数组 [4 最长回文子串]
- manacher算法求最长回文子串(hdu3068)
- 求最长回文子串的manchester算法
- 1040. Longest Symmetric String (25)【最长回文子串-马拉车(manacher算法)——PAT (Advanced Level) Practise
- 2014再见 2015你好 【附带】[LeetCode]最长回文子串