时间限制:1.000S 空间限制:32MB
题目描述
给你一个序列 X 和另一个序列 Z,当 Z 中的所有元素都在 X 中存在,并且在 X 中的下标顺序是严格递增的,那么就把 Z 叫做 X 的子序列。
例如:Z=<a,b,f,c>是序列X=<a,b,c,f,b,c>的一个子序列,Z中的元素在X中的下标序列为<1,2,4,6>。
现给你两个序列 X 和 Y,请问它们的最长公共子序列的长度是多少?
输入描述
输入包含多组测试数据。每组输入占一行,为两个字符串,由若干个空格分隔。每个字符串的长度不超过100。
输出描述
对于每组输入,输出两个字符串的最长公共子序列的长度。
输入示例
abcfbc abfcab
programming contest
abcd mnp
输出示例
4
2
0
答案
package main
import (
"bufio"
"os"
"fmt"
"strings"
)
var (
arr []string
)
func main() {
input := bufio.NewScanner(os.Stdin)
for input.Scan() {
arr = strings.Fields(input.Text())
fmt.Println(getMaxCommonSubseqCount(arr[0], arr[1]))
}
}
func getMaxCommonSubseqCount(s1, s2 string) int {
n1 := len(s1)
n2 := len(s2)
dp := make([][]int, n1 + 1)
for i := range dp {
dp[i] = make([]int, n2 + 1)
}
for i := 1; i <= n1; i++ {
for j := 1; j <= n2; j++ {
if s1[i - 1] == s2[j - 1] {
dp[i][j] = dp[i - 1][j - 1] + 1
} else {
dp[i][j] = max(
dp[i][j - 1],
dp[i - 1][j],
)
}
}
}
return dp[n1][n2]
}
func max(arr ...int) int {
n := len(arr)
if n == 0 {
panic("input error")
}
maxx := arr[0]
for i := 1; i < n; i++ {
if arr[i] > maxx {
maxx = arr[i]
}
}
return maxx
}