LeetCode周赛卡在第四题。。。
https://leetcode-cn.com/problems/shortest-common-supersequence/
参考大神java的代码:
class Solu1092 {
public String shortestCommonSupersequence(String str1, String str2) {
int len1=str1.length(),len2=str2.length();
int[][] dp=new int[len1+1][len2+1];
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(str1.charAt(i-1)==str2.charAt(j-1)){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
StringBuilder sb=new StringBuilder();
for(int i=len1,j=len2;i>0||j>0;){
if(i<=0){
sb.append(str2.charAt(–j));
}else if(j<=0){
sb.append(str1.charAt(–i));
}else if(dp[i][j]>dp[i-1][j]&&dp[i][j]>dp[i][j-1]){
sb.append(str1.charAt(–i));
–j;
}else if(dp[i][j]>dp[i-1][j]){
sb.append(str2.charAt(–j));
}else{
sb.append(str1.charAt(–i));
}
}
return sb.reverse().toString();
}
先建立了一个矩阵,然后逆推。在idea里debug了一下,结果确实是对的。但是实在想不通他这个DP矩阵存的东西代表什么意思。。。
另外到现在的刷题过程中,碰到的dp问题大多能解,只要发觉递推得关系就行,反而是一些字符串、数字问题无从下手。。。不知咋办。。