福哥答案2021-02-10:
自然智慧即可,
1.動態規劃,時間復雜度是O(MN),空間復雜度是O(MN),有代碼,
dp[i][j]只依賴左上邊,
①.如果str1[i]==str2[j],dp[i][j]=【左上邊】+1,
②.如果str1[i]==str2[j],dp[i][j]=0,
2.dp壓縮的動態規劃,時間復雜度是O(M*N),空間復雜度是O(1),有代碼,
3.后綴陣列,時間復雜度是O(M+N),無代碼,
代碼用golang撰寫,代碼如下:
package main
import "fmt"
func main() {
str1 := "moonfudadayy"
str2 := "yyfudadaxxx"
fmt.Println("動態規劃:", lcs1(str1, str2))
fmt.Println("dp壓縮的動態規劃:", lcs2(str1, str2))
}
//動態規劃
func lcs1(str1 string, str2 string) int {
str1Len := len(str1)
str2Len := len(str2)
if str1Len > str1Len {
str1, str2 = str2, str1
str1Len, str2Len = str2Len, str1Len
}
if str1Len == 0 {
return 0
}
dp := make([][]int, str1Len)
for i := 0; i < str1Len; i++ {
dp[i] = make([]int, str2Len)
}
ret := 0
for i := 0; i < str1Len; i++ {
if str1[i] == str2[0] {
dp[i][0] = 1
}
}
for j := 1; j < str2Len; j++ {
if str1[0] == str2[j] {
dp[0][j] = 1
}
}
for i := 1; i < str1Len; i++ {
for j := 1; j < str2Len; j++ {
if str1[i] == str2[j] {
dp[i][j] = 1 + dp[i-1][j-1]
ret = getMax(ret, dp[i][j])
}
}
}
return ret
}
//動態規劃,dp壓縮
func lcs2(str1 string, str2 string) int {
str1Len := len(str1)
str2Len := len(str2)
if str1Len > str1Len {
str1, str2 = str2, str1
str1Len, str2Len = str2Len, str1Len
}
if str1Len == 0 {
return 0
}
row := 0
col := str2Len - 1
ret := 0
for row < str1Len {
i := row
j := col
len := 0
for i < str1Len && j < str2Len {
if str1[i] != str2[j] {
len = 0
} else {
len++
}
ret = getMax(ret, len)
i++
j++
}
if col > 0 {
col--
} else {
row++
}
}
return ret
}
func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
執行結果如下:

左神java代碼
評論
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/258803.html
標籤:其他
上一篇:【演算法講10:自適應辛普森法】求平滑曲線積分近似 | 洛谷 P4526 | HDU1724 | QLU Youmu with Master spark
