思想
创建数组array[i][j]代表text1中以text[i]为首字母的字符串与text2中以text2[j]为首字母的字符串匹配的最大长度
得到递推公式
array[i][j]=array[i+1][j+1] (text1[i]==text2[j])
array[i][j]=0 (text1[i]!=text2[j])
首先处理边界
当字符串长度为1的时候,只有text1[i]==text2[j],array[i][j]=1,否则为0
代码
package main
import "fmt"
func main() {
fmt.Println(longestCommonSubstring("abcd","abd"))
}
func longestCommonSubstring(text1 string, text2 string) int {
len1:=len(text1)
len2:=len(text2)
//array[i][j]中存储首字母是text[i]以及text[j]的公共子串
array:=make([][]int,len1)
for i:=0;i<len1;i++{
array[i]=make([]int,len2)
}
//初始化边缘位置
for i:=0;i<len1;i++{
if text1[i]==text2[len2-1]{
array[i][len2-1]=1
}else{
array[i][len2-1]=0
}
}
for j:=0;j<len2-1;j++{
if text2[j]==text1[len1-1]{
array[len1-1][j]=1
}else{
array[len1-1][j]=0
}
}
//从右下角开始
for i:=len1-2;i>=0;i--{
for j:=len2-2;j>=0;j--{
if text1[i]==text2[j]{
array[i][j]=array[i+1][j+1]+1
}else{
array[i][j]=0
}
}
}
max:=0
//遍历数组,取出最大值
for i:=0;i<len1;i++{
for j:=0;j<len2;j++{
if array[i][j]>max{
max=array[i][j]
}
}
}
return max
}
时间复杂度
O(m*n)
389

被折叠的 条评论
为什么被折叠?



