动态规划法 最长公共子串 golang

思想

创建数组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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值