Palindromic Subsequence(最长回文字符串 输出路径)

初看好简单   一开始调试着一直re   后来也不知道怎么就对了  但是还有一些bug存在   ,

这道题的打印路径和light oj An Easy LCS(ps:点击打开链接)一样

但是只改一下会Tle  因为(1000*1000*1000)好大

但是把存储的字符串改为string 定义的就过了

但是还是有一点有点难受(下面会说出)

我也是醉了

#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
using namespace std;
#define maxx 1010
char s1[maxx];
char s2[maxx];
int dp[maxx][maxx];
string s[maxx][maxx];
int main()
{
       while(scanf("%s",s1+1)!=EOF){
	    memset(dp,0,sizeof(dp));
            int k;
            int n=strlen (s1+1);
            for(int i=1;i<=n;i++)
                s2[i]=s1[n-i+1];
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
            {
                if(s1[i]==s2[j])
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                        s[i][j]=s1[i]+s[i-1][j-1]+s2[j];
                }
                  else
               {
                   if(dp[i-1][j]>dp[i][j-1])
                   {
                       dp[i][j]=dp[i-1][j];
                       s[i][j]=s[i-1][j];
                   }
                   else if(dp[i][j-1]>dp[i-1][j])
                   {
                       dp[i][j]=dp[i][j-1];
                       s[i][j]=s[i][j-1];
                   }
                   else
                   {
                       dp[i][j]=dp[i-1][j];
                       if(s[i-1][j]>s[i][j-1])
                           s[i][j]=s[i][j-1];
                       else
                           s[i][j]=s[i-1][j];
                   }
               }
            }
        string s3= s[n][n];//怎么也没有想到string定义的是这样输出的
        int l = dp[n][n];
        if(l & 1) {
            for(int i=0; i<(l-1)/2; i++)
                cout << s3[i];
            for(int i=(l-1)/2; i>=0; i--)
                cout << s3[i];
        }
        else {
            for(int i=0; i<l/2; i++)
                cout << s3[i];
            for(int i=l/2-1; i>=0; i--)
                cout << s3[i];
        }
        cout << endl;
       }
    }
时间: 2024-10-25 00:39:15

Palindromic Subsequence(最长回文字符串 输出路径)的相关文章

Java Longest Palindromic Substring(最长回文字符串)

假设一个字符串从左向右写和从右向左写是一样的,这种字符串就叫做palindromic string.如aba,或者abba.本题是这种,给定输入一个字符串.要求输出一个子串,使得子串是最长的padromic string. 下边提供3种思路 1.两側比較法 以abba这样一个字符串为例来看,abba中,一共同拥有偶数个字.第1位=倒数第1位.第2位=倒数第2位......第N位=倒数第N位 以aba这样一个字符串为例来看,aba中.一共同拥有奇数个字符.排除掉正中间的那个字符后,第1位=倒数第1

516 Longest Palindromic Subsequence 最长回文子序列

给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 详见:https://leetcode.com/problems/longest-palindromic-subsequence/description/ C++: class Solution { public: int longestPalindromeSubseq(string s) { int n = s.size(); vector<vector<int>> dp(n, vector<in

[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的一个最长回文子串.暴力解决办法就是枚举所有的子串,再对每个子串进行回文判断.进行剪枝,我们考虑可以使用动态规划来避免重复的判

求取最长回文字符串,o(n)的最优算法manacher

算法的第一步就是在每个字符的左右都加上一个#,这样有什么效果呢. 比如aba初始化之后为#a#b#a#,字符串长度为7是奇数. 比如1221初始化之后为#1#2#2#1#,字符串长度为9是奇数. 为什么我们要将其转换成奇数呢,因为算法求取回文串长度的时候,需要有一个中心节点,之后分别向左右搜索,所以需要将回文串豆转换为奇数长度. 之后我们需要将str[0]赋值为一个字符,可以赋值为$,不这样做也可以,但是这样做我们就可以从1开始处理字符串,大家知道C++的数组是从0开始的. 算法的第二步就进入了

[LeetCode] 5. 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. 最长回文子串Longest palindromic substring, 最长回文子串或最长对称因子问题是在一个字符串中查找一个最长连续子串,这个子串

最长回文字符串 POJ3974

曾经有一个好算法放到我面前,我没有好好珍惜,直到用到的时候才后悔莫及. 那就是Manacher(马拉车算法),以O(n)的复杂度计算最长回文字符串. 曾经刷Leetcode的时候,室友跟我说了这个算法,但当时那个题目用中间枚举也过了,我就没有在意,直到前天才弄会,写这篇报告之前, 我又专门写了一遍马拉车,果然还是有点问题的. 详细原理链接 点击 Mark #include <stdio.h> #include <iostream> #include <string.h>

LeetCode-5:Longest Palindromic Substring(最长回文子字符串)

描述:给一个字符串s,查找它的最长的回文子串.s的长度不超过1000. Input: "babad" Output: "bab" Note: "aba" is also a valid answer. 我是采用动态规划解决此题的.官方的solutions中提供了几种思路,包括我使用的DP.这里摘要如下: 思路1: 将s反转得到s',然后查找s和s'的最长公共子串substring,那么substring就是最长回文子串.比如:s = "

Leetcode 5 Longest Palindromic Substring (最长回文子字符串)(动态规划)

Leetcode 5 题目描述 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. 例子 Example 1: Input: "babad" Output: "bab" Note: "aba" is also a valid answer. Example 2: Inp

Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. Example 1: Input: "babad" Output: "bab" Note: "aba" is also a valid answer. Example 2: Input: "cbbd"