最长公共字符串
//递归
func longestCommonSubsequence(text1 string, text2 string) int {
m := len(text1)+1
n := len(text2)+1
dp := make([][]int, m)
for i := 0 ; i < m; i++ {
dp[i] = make([]int, n)
}
var recursion func(x int , y int ) int
recursion = func(x int , y int ) int {
// 结束条件
if x == 0 || y == 0 {
return 0
}
// process data
// 缓存处理
if dp[x][y] != 0 {
return dp[x][y]
}
// 逻辑处理
if text1[x-1] == text2[y-1] {
// drill down
dp[x][y] = recursion(x-1, y -1 ) + 1
} else {
dp[x][y] = max(recursion(x-1, y ), recursion(x, y -1 ))
}
return dp[x][y]
}
recursion(m-1, n -1)
return dp[m-1][n-1]
}
func max(i ,j int) int {
if i <= j {
return j
}
return i
}
// 非递归
func max(i ,j int) int {
if i <= j {
return j
}
return i
}
// 类似于斐波那契数列 只不过这里是二维的
func longestCommonSubsequence(text1 string, text2 string) int {
m := len(text1)+1
n := len(text2)+1
count := make([][]int,m)
for i := 0; i < m ; i ++ {
count[i] = make([]int, n)
}
for i := 1; i < m; i ++ {
for j :=1;j < n; j ++ {
if text1[i-1] == text2[j-1] {
count[i][j] = count[i-1][j-1]+1
} else {
count[i][j] = max(count[i-1][j],count[i][j-1])
}
}
}
return count[m-1][n-1]
}Last updated
Was this helpful?