最長迴文子序列(不連續) 可輸出迴文序列
string LCS(string str1,string str2)//str2是str1的逆序
{
string fin=str1;
int length1,length2;
int arr[MAXN][MAXN];
length1 = str1.length();
length2 = str2.length();
memset(arr,0,sizeof(arr));
for (int i=1; i<=length1; i++)
for (int j=1; j<=length2; j++)
{
if (str1[i-1] == str2[j-1])
arr[i][j]=arr[i-1][j-1]+1;
else
arr[i][j]=(arr[i-1][j] > arr[i][j-1]?arr[i-1][j]:arr[i][j-1]);
}
cout << arr[length1][length2]<<endl;//串的長度
string print="";
for (int i=length1,j=length2; i>=1&&j>=1;)
{
if (str1[i-1] == str2[j-1])
{
print = str1[i-1]+print;
i--;
j--;
}
else
{
if(arr[i][j -1] >= arr[i - 1][j])
j--;
else
i--;
}
}
return print;//串
}
下面程式碼要解決掉的大概意思就是給定N個int型的數字,先找到最長迴文子序列,在原串中刪掉,然後在剩餘串中再找到最長迴文子序列,再刪掉……直到刪除完畢,輸出刪除的次數.
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10010;
string LCS(string str1,string str2)
{
string fin=str1;
int length1,length2;
int arr[MAXN][MAXN];
length1 = str1.length();
length2 = str2.length();
memset(arr,0,sizeof(arr));
for (int i=1; i<=length1; i++)
for (int j=1; j<=length2; j++)
{
if (str1[i-1] == str2[j-1])
arr[i][j]=arr[i-1][j-1]+1;
else
arr[i][j]=(arr[i-1][j] > arr[i][j-1]?arr[i-1][j]:arr[i][j-1]);
}
string print="";
for (int i=length1,j=length2; i>=1&&j>=1;)
{
if (str1[i-1] == str2[j-1])
{
print = str1[i-1]+print;
fin.erase(i-1,1);//刪除
i--;
j--;
}
else
{
if(arr[i][j -1] >= arr[i - 1][j])
j--;
else
i--;
}
}
if(fin.length()==1)//刪到只剩最後一個
return "0";
return fin;//刪除迴文序列之後的序列
}
int main()
{
int n;
cin>>n;
int a[MAXN];
string s="";
for(int i=0; i<n; ++i)
{
cin>>a[i];
s+=char(a[i]+int('0'));
}
if(n==1)
cout<<"1"<<endl;
else
{
string s1(s.rbegin(),s.rend());//逆序
string ss=LCS(s,s1);
int cnt=1;
while(1)
{
++cnt;
if(ss=="0")
break;
string s2(ss.rbegin(),ss.rend());//更新字串為刪除後的
ss=LCS(ss,s2);
}
cout<<cnt<<endl;
}
}
相關文章
- LeetCode516. 最長迴文子序列LeetCode
- 線性dp:LeetCode516 .最長迴文子序列LeetCode
- 程式碼隨想錄day46 || 647 迴文子串, 516 最長迴文子序列
- 程式碼隨想錄演算法訓練營 | 647. 迴文子串,516.最長迴文子序列演算法
- lc1771 由子序列構造的最長迴文串的長度
- java 最長迴文子串Java
- 程式碼隨想錄演算法訓練營day46| 647. 迴文子串 516.最長迴文子序列演算法
- 5. 最長迴文子串
- 【LeetCode動態規劃#14】子序列系列題(最長遞增子序列、最長連續遞增序列、最長重複子陣列、最長公共子序列)LeetCode動態規劃陣列
- 程式碼隨想錄演算法訓練營第五十七/天 | 516. 最長迴文子序列,647. 迴文子串演算法
- 最長迴文子串 -- 三種解答
- LeetCode 5.最長迴文子串LeetCode
- 最長公共子序列LCS 輸出所有LCS
- 求迴文子序列個數(雖然字串,但是DP)字串
- Leetcode[字串] 5. 最長迴文子串LeetCode字串
- 每日一算--最長迴文子串
- 演算法-兩最長迴文子串演算法
- LeetCode-5. 最長迴文子串(Manacher)LeetCode
- LeetCode-128-最長連續序列LeetCode
- LeetCode題集-5 - 最長迴文子串(一)LeetCode
- [動態規劃] 六、最長迴文子串動態規劃
- 演算法之字串——最長迴文子串演算法字串
- 最長迴文子串你學會了嗎?
- 1203- 最長迴文串
- leedcode-最長迴文串
- LeetCode - 409 - 最長迴文串LeetCode
- 淺談最長迴文子串求法——字串雜湊字串
- 每日一道 LeetCode (48):最長迴文子串LeetCode
- Leetcode5: Longest Palindromic Substring(最長迴文子串)LeetCode
- Amazon面試題:尋找最長迴文子串面試題
- Day 45 | 300.最長遞增子序列 、674. 最長連續遞增序列 、718. 最長重複子陣列陣列
- 最長公共子序列
- 最長上升子序列
- JS字串最長迴文查詢JS字串
- ch2_8_3求解迴文序列問題(遞迴實現)遞迴
- 最長公共子序列(JAVA)Java
- 迴文連結串列
- 【LeetCode(Java) - 298】二叉樹最長連續序列LeetCodeJava二叉樹