最长公共子序列变形简单题
将字符串处理一下, 把每一个子串 看成一个字符就可以了
#include<iostream> #include<algorithm> #include<cstring> using namespace std ; const int N = 1010 , INF = 1e9 ; string st1[N],st2[N] ; int f[N][N] ; int main(){ string a, b ;cin >> a >> b ; int n = a.size() , m = b.size() ; int q = 0 ; for(int i = 0 ; i < n ; i ++){ if(a[i] >= 'A' && a[i] <= 'Z') q++ ; st1[q] += a[i] ; } int w = 0 ; for(int i = 0 ; i < m ;i ++){ if(b[i] >= 'A' && b[i] <='Z') w ++ ; st2[w] += b[i] ; } memset(f,-INF, sizeof(f)) ; //这是对输入的一次遍历,输出看看我们的输入有没有错误 // for(int i = 1 ; i <= q ; i ++){ // cout<< st1[i] << " " ; // } // cout << endl ; // for(int i = 1 ; i <= w ; i ++){ // cout << st2[i] << " " ; // } // cout << endl ; for(int i = 1 ; i <= q ; i ++){ for(int j = 1 ; j <= w ; j ++){ f[i][j] =max(f[i-1][j] , f[i][j-1]) ; if(st1[i] == st2[j]) f[i][j] = max(f[i-1][j-1] + 1 , f[i][j]) ; } } cout << f[q][w] << endl ; return 0 ; }