/*
3. 多样本位置全对应的尝试模型
题目五
两个字符串的最长公共子序列问题
"ab1cd2ef345gh"
"OPQ123RS4tx5YZ"
//最长公共子序列 “12345”
“a123bc” "12dea3f"
012345 0123456
一个样本做行,一个样本做列
0 1 2 3 4 5 6 str2 index dp[i][j] str[0...i] str2[0...j]最长公共子序列的长度
0 (a,1)0 0 0 0 1 1 1
1 1
2 1
3 1
4 1
5 1
str1 index
任何一个普遍位置
0 1 2 3 4 5 6 str2 index dp[i][j] str1[0...i] str2[0...j]最长公共子序列的长度
0 (a,1)0 0 0 0 1 1 1 任何一个普遍位置 不以str1[i]结尾, 也不以 str[j]结尾
1 1 str1[0...i-1] str[0...j-1]
2 1
3 1
4 1
5 1
str1 index
str1[0...i] str[0...j]
1.最长公共子序列可能既不以str1[i],也不以str2[j] 结尾 dp[i-1][j-1]
2.最长公共子序列可能 以str1[i], 不以str2[j] 结尾 dp[i][j-1]
3.最长公共子序列可能 不以str1[i], 以str2[j] 结尾 dp[i-1][j]
4.最长公共自序列 以str1[i], 又以str2[j] 结尾 dp[i-1][j-1] + 1 同时扔掉一个 再加一个
可能性 str1[i] == str2[j]
*/
func lcse(str1, str2 string) int {
dp := make([][]int,len(str1))
for k := range dp {
dp[k] = make([]int,len(str2))
}
if str1[0] == str2[0] {
dp[0][0] = 1
}
for i := 1; i < len(str1); i++ { // 填第0列
dp[i][0] = Max(dp[i-1][0], map[bool]int{ str1[i] == str2[0]:1,str1[i] != str2[0]:0}[true])
}
for j := 1; j < len(str2); j++ { // 填第0行
dp[0][j] = Max(dp[0][j-1], map[bool]int{ str1[0] == str2[j]:1,str1[0] != str2[j]:0}[true])
}
for i := 1; i < len(str1); i++ {
for j := 1; j < len(str2); j++ {
dp[i][j] = Max(dp[i-1][j],dp[i][j-1])
if str1[i] == str2[j] {
dp[i][j] = Max(dp[i][j],dp[i-1][j-1]+1)
} //else { 不加else 也对
// dp[i][j] = Max(dp[i][j], dp[i-1][j-1])
//}
}
}
return dp[len(str1)-1][len(str2)-1]
}
func TestLCSE(t *testing.T) {
fmt.Println(lcse("hello","world helll"))
fmt.Println(lcse("ab1cd2ef345gh","OPQ123RS4tx5YZ"))
}
动态规划——多样本位置全对应的尝试模型
最新推荐文章于 2024-01-28 22:37:20 发布