class LCS {
public:
    int findLCS(string A, int n, string B, int m) {
        // write code here
        //动态规划,dp[i][j]代表A的前i个字符和B的前j个字符的LCS
        //dp[i][j]=dp[i-1][j-1],当A[i-1]=B[j-1];
        //dp[i][j]=max(dp[i-1][j],dp[i][j-1]);当不相等时;
        //只用到了左边和上面和左上的位置的记录,我们用一个额外空间记录左上就足够了
        vector<int>dp(m+1,0);
        for(int i=1; i<=n; i++)
        {
            //记录左上位置
            int prev=dp[0];
            for(int j=1; j<=m; j++)
            {
                int tmp= dp[j];
                if(A[i-1]==B[j-1])
                    dp[j]=prev+1;
                else
                    dp[j]=max(dp[j-1],dp[j]);
                prev=tmp;
            }
        }
        return dp[m];
    }
};