最长公共子串

给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列

输入、

"1A2C3D4B56","B1D23A456A

输出

“2345”

 

状态转换方程:
s1[i] == s2[j]    ---> dp[i][j] = dp[i-1][j--1] + 1

s1[i] != s2[j]    ---> dp[i][j] = 0

 

func LCS( str1 string ,  str2 string ) string{

	row := len(str1)
	col := len(str2)
	if row==0 || col==0 {
		return ""
	}

	dp := make([][]int, row+1)
	for i:=0;i<row+1;i++{
		dp[i] = make([]int, col+1)
	}
	for i:=0;i<row+1;i++ {
		dp[i][0] = 0
	}
	for i:=0;i<col+1;i++ {
		dp[0][i] = 0
	}

	max := 0
	endIndex := 0
	for i:=1;i<=row;i++{
		for j:=1;j<=col;j++ {

			if str1[i-1] == str2[j-1]{
				dp[i][j] = dp[i-1][j-1]+1
			}else{
				dp[i][j] = 0
			}

			if dp[i][j] > max {
				max = dp[i][j]
				endIndex = i
			}
		}
	}
	return str1[endIndex-max:endIndex]
}

  

posted @ 2021-05-14 15:05  寅鸷  阅读(55)  评论(0编辑  收藏  举报