时间复杂度:O(n²),空间复杂度:O(n²)
解题思路
二维的动态规划。字符串1和字符串2分别代表行和列,这样二维数组的每个位置都代表着两个字符串对应位置的字符,比较两字符,如果相同说明是公共子序列的一个字符,令dp[i][j]=dp[i-1][j-1],否则就是左相邻和上相邻中的最大dp值。
需要注意的是,为了处理边界条件,二维数组需要多扩充一行和一列。
AC代码
func longestCommonSubsequence(text1 string, text2 string) int {
m,n:=len(text1),len(text2)
dp:=make([][]int,m+1)
for i:=0;i<len(dp);i++{
dp[i]=make([]int,n+1)
}
for i,c1:=range text1{
for j,c2:=range text2{
if c1==c2{
dp[i+1][j+1]=dp[i][j]+1
}else{
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j])
}
}
}
return dp[m][n]
}
func max(a,b int)int{
if a>b{
return a
}else{
return b
}
}
感悟
为了方便地处理边界条件,二维数组需要多加一行和一列,这样在比较两字符串的第一个字符时无需单独处理。另外遍历的是两字符串所有字符而不是二维数组的位置,这样字符的下标和二维数组位置的下标会差1,这点需要注意。