// X,Y是字符串
LCS-LENGTH(X, Y):
m ← length[X]
n ← length[Y]// 初始化边界,用于下面开始i=0时的c[i-1,j-1]之类的获取0值// 初始化列为0,空过c[0,0]for i ← 1 to m
do c[i,0] ← 0// 初始化行为0,顺便填上c[0,0]for j ← 0 to n
do c[0,j] ← 0// 先行后列,是逐行的效果// 每行for i ← 1 to m
// 每列dofor j ← 1 to n
// 一样字符,看左上角↖,其值+1doif x[i]= y[j]
then c[i,j] ← c[i-1,j-1]+1// 左上箭头是因为c[i-1,j-1]是在c[i,j]左上角
b[i,j] ← "↖"// 不一样的字符,比较上方↑和左方←,看谁大取谁elseif c[i-1,j] ≥ c[i,j-1]
then c[i,j] ← c[i-1,j]// 因为c[i-1,j]是在c[i,j]上一行
b[i,j] ← "↑"else c[i,j] ← c[i,j-1]// 因为c[i,j-1]是在c[i,j]左一列
b[i,j] ← "←"
PRINT-LCS(b, X, i, j)// 第一行、第一列时if i =0or j =0
then return// 左上,表示相等字符才输出if b[i,j]="↖"
then PRINT-LCS(b,X,i-1,j-1)
print x[i]// 上elseif b[i,j]="↑"
then PRINT-LCS(b,X,i-1,j)// 左else PRINT-LCS(b,X,i,j-1)
3.C++
#include<iostream>#include<vector>#include<string.h>usingnamespace std;voidLCS_LEGTH(char x[],char y[], vector<vector<int>>&c, vector<vector<char>>&b){int m =strlen(x);int n =strlen(y);// 初始化边界,用于下面开始i=0时的c[i-1,j-1]之类的获取0值// 初始化列为0,空过c[0,0]for(int i =1; i <= m; i++){
c[i][0]=0;}// 初始化行为0,顺便填上c[0,0]for(int j =0; j <= n; j++){
c[0][j]=0;}// 先行后列,是逐行的效果// 每行for(int i =1; i <= m; i++){// 每列for(int j =1; j <= n; j++){// 一样字符,看左上角↖,其值+1// 注意,x、y从0开始if(x[i -1]== y[j -1]){
c[i][j]= c[i -1][j -1]+1;// 左上箭头是因为c[i-1,j-1]是在c[i,j]左上角// 用q表示左上,因为'↖'超过了char范围
b[i][j]='q';}// 不一样的字符,比较上方↑和左方←,看谁大取谁else{if(c[i -1][j]>= c[i][j -1]){
c[i][j]= c[i -1][j];// 因为c[i-1,j]是在c[i,j]上一行// 用w表示上
b[i][j]='w';}else{
c[i][j]= c[i][j -1];// 因为c[i,j-1]是在c[i,j]左一列// 用a表示左
b[i][j]='a';}}}}}voidprint_LCS(vector<vector<char>>&b,char x[],int i,int j){// 第一行、第一列时if(i ==0|| j ==0){return;}// 左上q,表示相等字符才输出if(b[i][j]=='q'){print_LCS(b, x, i -1, j -1);// 注意,x、y从0开始printf("%c", x[i -1]);}// 上welseif(b[i][j]=='w'){print_LCS(b, x, i -1, j);}// 左aelse{print_LCS(b, x, i, j -1);}}intmain(void){char x[]="ABCBDAB";char y[]="BDCABA";int m =strlen(x);int n =strlen(y);// m+1行,n+1列,因为要特别使用第一行第一列,[0,m],[0,n]
vector<vector<int>>c(m +1, vector<int>(n +1));
vector<vector<char>>b(m +1, vector<char>(n +1));// 解题LCS_LEGTH(x, y, c, b);// 输出print_LCS(b, x, m, n);return0;}
二、最长子串
1.分析
2.c++
#include<iostream>#include<vector>#include<string.h>usingnamespace std;voidLCS_substring(char x[],char y[]){int m =strlen(x);int n =strlen(y);// m+1行,n+1列,因为要特别使用第一行第一列,[0,m],[0,n]
vector<vector<int>>c(m +1, vector<int>(n +1));// 初始化边界,用于下面开始i=0时的c[i-1,j-1]之类的获取0值// 初始化列为0,空过c[0,0]for(int i =1; i <= m; i++){
c[i][0]=0;}// 初始化行为0,顺便填上c[0,0]for(int j =0; j <= n; j++){
c[0][j]=0;}// 最大子串的最后一个字符的下标int end_index =-1;// 最大子串的长度int length_substring =0;// 先行后列,是逐行的效果// 每行for(int i =1; i <= m; i++){// 每列for(int j =1; j <= n; j++){// 一样字符,看左上角↖,其值+1// 注意,x、y从0开始if(x[i -1]== y[j -1]){
c[i][j]= c[i -1][j -1]+1;}// 不一样的字符,就断了,0else{
c[i][j]=0;}if(c[i][j]> length_substring){
length_substring = c[i][j];// 注意,x、y从0开始
end_index = i -1;}}}// 输出for(int i = end_index - length_substring +1; i <= end_index; i++){printf("%c", x[i]);}}intmain(void){char x[]="xzyzzyx";char y[]="zxyyzxz";int m =strlen(x);int n =strlen(y);// 解题LCS_substring(x, y);return0;}
文章目录伪码C++伪码// X,Y是字符串LSC-LENGTH(X, Y): m ← length[X] n ← length[Y] // 初始化边界,用于下面开始i=0时的c[i-1,j-1]之类的获取0值 // 初始化列为0,空过c[0,0] for i ← 1 to m do c[i,0] ← 0 // 初始化行为0,顺便填上c[0,0] for j ← 0 to...