我昨天面了天美L1的游戏客户端开发,面了我100分钟,问完实习、项目、计算机图形学和C++后给了我两道算法题做,一道是最长公共子序列,一道是LRU缓存,我知道是经典的题目,但是我都没敲过,最长公共子序列面试前一晚运气好随口问了一下GPT的解决思路,记得是二维的动态规划
原题:1143. 最长公共子序列 - 力扣(LeetCode)
为什么用动态规划呢,因为最长公共子序列具有最优子结构性质,子问题的最优解之间互不影响,而原问题的解可以由子问题的解推出来,记dp[i][j]是两个字符串的前i个和前j个子串的最长公共子序列(LCS)的长度,如果此刻遍历到的两个字符是相同的,那么dp[i][j]就应该等于dp[i-1][j-1]+1,否则应该是dp[i-1][j]和dp[i][j-1]的较大者
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
vector<vector<int>>dp(text1.size()+1,vector<int>(text2.size()+1));
for(int i=1;i<=text1.size();i++){
for(int j=1;j<=text2.size();j++){
if(text1[i-1]==text2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[text1.size()][text2.size()];
}
};