class Solution { public: string LCS(string str1, string str2) { vector<vector<unsigned short>> dp; unsigned short record = 0; int end_pos; for (int i = 0; i <= str1.size(); ++i) dp.push_back(vector<unsigned short>(str2.size() + 1)); for (int i = 1; i <= str1.size(); ++i) { for (int j = 1; j <= str2.size(); ++j) { if (str1[i - 1] == str2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1; if (dp[i][j] > record) { record = dp[i][j]; end_pos = i; } } } } return str1.substr(end_pos - record, record); } };
DP数组定义为:以str[i-1] str[j-1]为结尾的字串的长度
同时需要记录一个全局最长答案,以及此答案对应的字母串的字母下标。我们最后是需要通过这个信息去返回字符串本身的。
PS:
1. 这里因为字符串长度5000以内,因此用unsigned short降低内存占用
2. substr方法注意是(pos,count),而不是(pos,end)。这里跟Python完全不同。