最長のパリンドロームサブシーケンス
最長のパリンドロームサブシーケンスは、特定のシーケンスのサブシーケンスであり、サブシーケンスはパリンドロームです。
この問題では、文字の1つのシーケンスが与えられ、パリンドロームのサブシーケンスの最長の長さを見つける必要があります。
この問題を解決するために、再帰式を使用できます。
L(0、n-1)を使用して、最長のパリンドロームサブシーケンスの長さを格納する場合、
L(0、n-1):=L(1、n-2)+ 2(0番目と(n-1)番目の文字が同じ場合)
入力と出力
Input: A string with different letters or symbols. Say the input is “ABCDEEAB” Output: The longest length of the largest palindromic subsequence. Here it is 4. ABCDEEAB. So the palindrome is AEEA.
アルゴリズム
palSubSeqLen(str)
入力- 指定された文字列。
出力- 最長のパリンドロームサブシーケンスの長さ。
Begin n = length of the string create a table called lenTable of size n x n and fill with 1s for col := 2 to n, do for i := 0 to n – col, do j := i + col – 1 if str[i] = str[j] and col = 2, then lenTable[i, j] := 2 else if str[i] = str[j], then lenTable[i, j] := lenTable[i+1, j-1] + 2 else lenTable[i, j] := maximum of lenTable[i, j-1] and lenTable[i+1, j] done done return lenTable[0, n-1] End
例
#include<iostream> using namespace std; int max (int x, int y) { return (x > y)? x : y; } int palSubseqLen(string str) { int n = str.size(); int lenTable[n][n]; // Create a table to store results of subproblems for (int i = 0; i < n; i++) lenTable[i][i] = 1; //when string length is 1, it is palindrome for (int col=2; col<=n; col++) { for (int i=0; i<n-col+1; i++) { int j = i+col-1; if (str[i] == str[j] && col == 2) lenTable[i][j] = 2; else if (str[i] == str[j]) lenTable[i][j] = lenTable[i+1][j-1] + 2; else lenTable[i][j] = max(lenTable[i][j-1], lenTable[i+1][j]); } } return lenTable[0][n-1]; } int main() { string sequence = "ABCDEEAB"; int n = sequence.size(); cout << "The length of the longest palindrome subsequence is: " << palSubseqLen(sequence); }
出力
The length of the longest palindrome subsequence is: 4
-
Pythonで最長増加部分列
ソートされていない整数のリストがあるとします。最も長く増加するサブシーケンスを見つける必要があります。したがって、入力が[10,9,2,5,3,7,101,18]の場合、増加するサブシーケンスは[2,3,7,101] であるため、出力は4になります。 これを解決するには、次の手順に従います- trail:=長さ0からnums – 1の長さの配列で、これを0で埋めます サイズ:=0 numsのxの場合 i:=0、j:=サイズ 私はjではありません mid:=i +(j --i)/ 2 trails [mid]
-
Pythonで最長の回文部分文字列
文字列Sがあるとします。Sで最も長い回文部分文字列を見つける必要があります。文字列Sの長さは1000であると想定しています。したがって、文字列が「BABAC」の場合、その場合、最長の回文部分文字列は「BAB」です。 これを解決するために、次の手順に従います 文字列の長さと同じ次数の正方行列を1つ定義し、Falseで埋めます 主対角要素をtrueに設定して、0からorder –1までのすべてのiに対してDP[i、i] =True start:=0 範囲2からS+1の長さのlの場合 0からSの長さの範囲のiの場合– l + 1 end:=i + l l =2の場合、 S [i]