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完全不同。

京公网安备 11010502036488号