时间限制: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
}