网易首页 > 网易号 > 正文 申请入驻

文心一言 VS 讯飞星火 VS chatgpt (206)-- 算法导论15.4 3题

0
分享至

三、设计 LCS-LENGTH的带备忘的版本,运行时间为O(mn)。需要写代码的时候,请用go语言。

文心一言,代码正常运行:

LCS-LENGTH(Longest Common Subsequence Length)问题的带备忘的版本通常指的是使用动态规划(Dynamic Programming, DP)和备忘录(Memoization)来优化算法性能,避免重复计算。通过维护一个表(即“备忘录”)来存储已经计算过的子问题的解,从而在解决新问题时可以直接查找已存储的结果,而不是重新计算。

以下是使用Go语言实现的一个带备忘的LCS-LENGTH算法的示例。在这个示例中,lcsLength 函数计算两个字符串的最长公共子序列长度,并且使用一个二维数组 memo 来存储子问题的解,其中 memo[i][j] 存储的是 str1 的前 i 个字符和 str2 的前 j 个字符的最长公共子序列长度。

packagemain
import(
"fmt"
)
funclcsLength(str1,str2string)int{
m,n:=len(str1),len(str2)
memo:=make([][]int,m+1)
fori:=rangememo{
memo[i]=make([]int,n+1)
}
fori:=1;i<=m;i++{
forj:=1;j<=n;j++{
ifstr1[i-1]==str2[j-1]{
memo[i][j]=memo[i-1][j-1]+1
}else{
memo[i][j]=max(memo[i-1][j],memo[i][j-1])
}
}
}
returnmemo[m][n]
}
funcmax(a,bint)int{
ifa>b{
returna
}
returnb
}
funcmain(){
str1:="ABCDEFG"
str2:="XYZABCDEFGHIJKL"
length:=lcsLength(str1,str2)
fmt.Printf("ThelengthoftheLongestCommonSubsequenceis:%d\n",length)
}

在这个实现中,lcsLength 函数首先初始化一个 (m+1) x (n+1) 的二维数组 memo,其中 m 和 n 分别是两个输入字符串 str1 和 str2 的长度。然后,它使用两个嵌套的循环来遍历 str1 和 str2 的所有字符组合。

如果 str1 的第 i 个字符和 str2 的第 j 个字符相同,则最长公共子序列的长度加一,即 memo[i][j] = memo[i-1][j-1] + 1。如果不同,则最长公共子序列的长度是去掉 str1 的第 i 个字符后的最长公共子序列和去掉 str2 的第 j 个字符后的最长公共子序列中的较大值,即 memo[i][j] = max(memo[i-1][j], memo[i][j-1])。

最后,函数返回 memo[m][n],即两个字符串的最长公共子序列的长度。

请注意,这个实现的时间复杂度是 O(mn),其中 m 和 n 分别是两个输入字符串的长度。这是因为我们需要填充一个 m x n 的表,而每个表项的计算时间是常数时间。







讯飞星火,代码正常运行:

在Go语言中,我们可以使用动态规划来解决这个问题。以下是实现LCS-LENGTH的带备忘的版本的代码:

packagemain
import"fmt"
funcmax(a,bint)int{
ifa>b{
returna
}
returnb
}
funclcsLength(X,Y[]int)int{
m:=len(X)
n:=len(Y)
c:=make([][]int,m+1)
fori:=rangec{
c[i]=make([]int,n+1)
}
fori:=0;i<=m;i++{
forj:=0;j<=n;j++{
ifi==0||j==0{
c[i][j]=0
}elseifX[i-1]==Y[j-1]{
c[i][j]=c[i-1][j-1]+1
}else{
c[i][j]=max(c[i-1][j],c[i][j-1])
}
}
}
returnc[m][n]
}
funcmain(){
X:=[]int{1,3,4,5,6,7,7,8}
Y:=[]int{2,3,5,6,7,8,9,10}
fmt.Println("LengthofLCSis",lcsLength(X,Y))
}

在这个程序中,我们首先定义了一个二维数组c,用于存储子问题的解。然后,我们遍历两个输入序列,如果当前位置的元素相同,则该位置的LCS长度为左上角元素的LCS长度加一;否则,该位置的LCS长度为左边元素和上边元素中较大的那个LCS长度。最后,右下角的元素就是整个序列的LCS长度。





360智脑,代码不能运行:

以下是一个使用Go语言实现的LCS-Length带备忘的版本:

packagemain
funclcsLength(memomap[int][int]int,Xstring,Ystring,mint,nint)int{
ifm==0||n==0{
return0
}
ifv,ok:=memo[m][n];ok{
returnv
}
ifX[m-1]==Y[n-1]{
memo[m][n]=lcsLength(memo,X,Y,m-1,n-1)+1
}else{
memo[m][n]=max(lcsLength(memo,X,Y,m-1,n),lcsLength(memo,X,Y,m,n-1))
}
returnmemo[m][n]
}
funcmax(a,bint)int{
ifa>b{
returna
}
returnb
}
funcmain(){
X:="ABCBDAB"
Y:="BDCAB"
memo:=make(map[int][int]int)
m:=len(X)
n:=len(Y)
fmt.Println(lcsLength(memo,X,Y,m,n))
}

在这个代码中,我们使用了一个备忘录(memo)来存储之前计算过的LCS长度。当我们计算LCS长度时,我们首先检查备忘录中是否已经有这个值。如果有,我们就直接返回它;如果没有,我们就计算它,并将其存储在备忘录中。

这个算法的运行时间为O(mn),因为我们在计算LCS长度时,最多需要遍历X和Y字符串的每个字符。





智谱清言,代码正常运行:

为了设计一个运行时间为O(mn)的LCS-LENGTH算法,我们可以使用动态规划(DP)技术,并辅以带备忘的递归方法来避免重复计算。在下面给出的Go语言代码中,我们将计算两个字符串和的最长公共子序列的长度。

str1

str2

packagemain
import(
"fmt"
)
//LCSLength计算两个字符串的最长公共子序列的长度
//使用带备忘的递归方法
funcLCSLength(str1,str2string)int{
//创建一个二维切片来保存子问题的结果
//dp[i][j]表示str1的前i个字符与str2的前j个字符的LCS长度
dp:=make([][]int,len(str1)+1)
fori:=rangedp{
dp[i]=make([]int,len(str2)+1)
}
//初始化dp数组
fori:=0;i<=len(str1);i++{
forj:=0;j<=len(str2);j++{
ifi==0||j==0{
dp[i][j]=0
}
}
}
//递归计算LCS长度,同时更新dp数组
returnrecursiveLCSLength(str1,str2,0,0,dp)
}
//recursiveLCSLength递归计算最长公共子序列的长度
//同时更新dp数组以避免重复计算
funcrecursiveLCSLength(str1,str2string,i,jint,dp[][]int)int{
//检查是否已经计算过这个子问题
ifdp[i][j]!=0{
returndp[i][j]
}
//如果i或j为0,那么LCS长度为0
ifi==0||j==0{
dp[i][j]=0
return0
}
//如果str1[i-1]==str2[j-1],那么当前字符是LCS的一部分
ifstr1[i-1]==str2[j-1]{
dp[i][j]=1+recursiveLCSLength(str1,str2,i-1,j-1,dp)
}else{
//否则,取左侧或上侧的LCS长度中的较大值
dp[i][j]=max(recursiveLCSLength(str1,str2,i-1,j,dp),recursiveLCSLength(str1,str2,i,j-1,dp))
}
returndp[i][j]
}
//max返回两个整数中的较大值
funcmax(a,bint)int{
ifa>b{
returna
}
returnb
}
funcmain(){
str1:="ABCBDAB"
str2:="BDCAB"
fmt.Println("ThelengthofLCSis:",LCSLength(str1,str2))
}

这段代码定义了一个函数,它使用一个二维切片来存储子问题的解,并且通过递归函数来计算最长公共子序列的长度。递归函数会在每次需要计算相同子问题时,检查是否已经在中存储了结果,以避免重复计算。

LCSLength

dp

recursiveLCSLength

dp

函数中给出了一个例子,计算字符串"ABCBDAB"和"BDCAB"的最长公共子序列的长度,并打印结果。

main







天工,代码正常运行:

Certainly! Below is an implementation of the LCS problem with memoization in Go that runs in O(mn) time, where m and n are the lengths of the two input strings. This implementation uses a二维数组 to store the results of subproblems, avoiding重复计算.

packagemain
import"fmt"
//LCSMemocomputesthelengthofthelongestcommonsubsequencebetweenXandYusingmemoization.
funcLCSMemo(X,Ystring)int{
m,n:=len(X),len(Y)
dp:=make([][]int,m+1)
fori:=rangedp{
dp[i]=make([]int,n+1)
}
fori:=1;i<=m;i++{
forj:=1;j<=n;j++{
ifX[i-1]==Y[j-1]{
dp[i][j]=dp[i-1][j-1]+1
}else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
}
}
}
returndp[m][n]
}
//maxreturnsthelargeroftwointegers.
funcmax(a,bint)int{
ifa>=b{
returna
}
returnb
}
funcmain(){
X:="AGGTAB"
Y:="GXTXAYB"
length:=LCSMemo(X,Y)
fmt.Printf("LengthofLCS:%d\n",length)
}

To use this code, simply run it with the Go runtime and it will output the length of the longest common subsequence between the two given strings. Thefunction is used to handle the comparison of integers, asin Go does not guarantee a specific signedness.

max

int





灵小智,代码正常运行:

下面是用Go语言编写的带备忘录的最长公共子序列(LCS)问题的代码示例:

packagemain
import(
"fmt"
)
funcmax(a,bint)int{
ifa>b{
returna
}
returnb
}
funclcsLengthMemoized(X,Ystring,m,nint,memo[][]int)int{
ifm==0||n==0{
return0
}
ifmemo[m][n]!=-1{
returnmemo[m][n]
}
ifX[m-1]==Y[n-1]{
memo[m][n]=1+lcsLengthMemoized(X,Y,m-1,n-1,memo)
returnmemo[m][n]
}
memo[m][n]=max(lcsLengthMemoized(X,Y,m-1,n,memo),lcsLengthMemoized(X,Y,m,n-1,memo))
returnmemo[m][n]
}
funclcsLength(X,Ystring)int{
m:=len(X)
n:=len(Y)
memo:=make([][]int,m+1)
fori:=rangememo{
memo[i]=make([]int,n+1)
forj:=rangememo[i]{
memo[i][j]=-1
}
}
returnlcsLengthMemoized(X,Y,m,n,memo)
}
funcmain(){
X:="ABCBDAB"
Y:="BDCAB"
fmt.Printf("LengthofLCS:%d\n",lcsLength(X,Y))
}

在这个代码中,我们使用了备忘录(memo)来保存已计算过的子问题的结果,以避免重复计算。通过将已计算过的结果存储在备忘录中,我们可以将算法的运行时间从指数级别降低到线性级别。这样,算法的运行时间为O(mn),其中m和n分别是字符串X和Y的长度。

以上是用Go语言编写的带备忘录的LCS问题的代码示例,希望对你有帮助!





chatgpt,代码正常运行:

当设计LCS-LENGTH函数的带备忘的版本时,可以使用动态规划的思想。下面是用Go语言实现的代码:

packagemain
import(
"fmt"
)
funclcsLengthMemo(X,Ystring)int{
m:=len(X)
n:=len(Y)
//创建并初始化备忘录
memo:=make([][]int,m+1)
fori:=0;i<=m;i++{
memo[i]=make([]int,n+1)
forj:=0;j<=n;j++{
memo[i][j]=-1
}
}
varlcsfunc(int,int)int
lcs=func(i,jint)int{
ifmemo[i][j]!=-1{//如果已经计算过,直接返回备忘录中的值
returnmemo[i][j]
}
ifi==0||j==0{//边界条件,其中一个字符串为空
memo[i][j]=0
return0
}
ifX[i-1]==Y[j-1]{//当前字符匹配成功,继续向前匹配
memo[i][j]=lcs(i-1,j-1)+1
returnmemo[i][j]
}else{//当前字符不匹配,取两种情况下的最大值
left:=lcs(i-1,j)
top:=lcs(i,j-1)
ifleft>top{
memo[i][j]=left
}else{
memo[i][j]=top
}
returnmemo[i][j]
}
}
returnlcs(m,n)
}
funcmain(){
X:="ABCBDAB"
Y:="BDCAB"
fmt.Println("LCS长度:",lcsLengthMemo(X,Y))
}

该代码使用了备忘录来存储已经计算过的子问题的结果,避免重复计算。通过递归方式进行动态规划,从后往前匹配字符串,并记录最长公共子序列的长度。运行时间复杂度为O(mn)。





kimi,代码正常运行:

在 Go 语言中,设计一个带有备忘(Memoization)的 LCS-LENGTH 版本,可以通过创建一个额外的二维切片来存储已经计算过的子问题的解。这样,当我们需要计算一个新的子问题时,我们首先检查这个解是否已经被计算过。如果已经计算过,我们可以直接使用这个解,而不需要重新计算,从而提高算法的效率。

以下是带有备忘的 LCS-LENGTH 函数的 Go 语言实现:

packagemain
import(
"fmt"
)
//LCS-LENGTH函数计算两个序列的最长公共子序列的长度
funcLCSLength(x,y[]int)int{
m,n:=len(x),len(y)
memo:=make([][]int,m+1)
fori:=rangememo{
memo[i]=make([]int,n+1)
}
returnlcsLengthMemo(x,y,m,n,memo)
}
//lcsLengthMemo是LCS-LENGTH的递归实现,带有备忘
funclcsLengthMemo(x,y[]int,m,nint,memo[][]int)int{
ifm==0||n==0{
return0
}
//检查解是否已经在备忘数组中
ifmemo[m][n]!=0{
returnmemo[m][n]
}
ifx[m-1]==y[n-1]{
//如果当前元素相同,递归计算去掉这两个元素后的子问题的解
memo[m][n]=1+lcsLengthMemo(x,y,m-1,n-1,memo)
}else{
//如果当前元素不同,分别计算两种情况的解,并取最大值
memo[m][n]=max(
lcsLengthMemo(x,y,m-1,n,memo),
lcsLengthMemo(x,y,m,n-1,memo),
)
}
returnmemo[m][n]
}
//max返回两个整数中的最大值
funcmax(a,bint)int{
ifa>b{
returna
}
returnb
}
funcmain(){
x:=[]int{1,0,0,1,0,1,0,1}
y:=[]int{0,1,0,1,1,0,1,1,0}
length:=LCSLength(x,y)
fmt.Printf("LengthofLCS:%d\n",length)
}

在这个实现中,函数是用户调用的接口,它初始化备忘数组并调用函数。函数是递归实现,它使用备忘数组来避免重复计算。这个算法的时间复杂度是 O(m * n),因为每个子问题只计算一次,并且我们使用 O(m * n) 的空间来存储备忘数组。

LCSLength

lcsLengthMemo

lcsLengthMemo





混元,代码正常运行:

带备忘的 LCS-LENGTH 算法是一种动态规划方法,用于计算两个字符串的最长公共子序列的长度。以下是使用 Go 语言实现的带备忘的 LCS-LENGTH 算法:

packagemain
import(
"fmt"
)
funclcsLengthMemo(x,ystring,m,nint,memo[][]int)int{
ifm==0||n==0{
return0
}
ifmemo[m][n]!=-1{
returnmemo[m][n]
}
ifx[m-1]==y[n-1]{
memo[m][n]=1+lcsLengthMemo(x,y,m-1,n-1,memo)
}else{
memo[m][n]=max(lcsLengthMemo(x,y,m-1,n,memo),lcsLengthMemo(x,y,m,n-1,memo))
}
returnmemo[m][n]
}
funclcsLength(x,ystring)int{
m,n:=len(x),len(y)
memo:=make([][]int,m+1)
fori:=rangememo{
memo[i]=make([]int,n+1)
forj:=rangememo[i]{
memo[i][j]=-1
}
}
returnlcsLengthMemo(x,y,m,n,memo)
}
funcmax(a,bint)int{
ifa>b{
returna
}
returnb
}
funcmain(){
x:="ABCBDAB"
y:="BDCAB"
fmt.Printf("ThelengthoftheLCSis:%d\n",lcsLength(x,y))
}

这个实现首先创建一个二维数组用于存储已经计算过的子问题的解。函数是一个递归函数,用于计算两个字符串的最长公共子序列的长度。当递归到基本情况时,它会返回 0。如果当前子问题已经计算过,它会直接返回已经计算的结果。否则,它会计算当前子问题的解,并将其存储在备忘录中,然后返回解。

memo

lcsLengthMemo

函数是一个包装函数,用于初始化备忘录并调用函数。最后,函数调用函数并打印结果。

lcsLength

lcsLengthMemo

main

lcsLength





声明:内容由AI生成

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
卡夫卡最精辟的8句话:于荒诞中,觉醒世人一百年

卡夫卡最精辟的8句话:于荒诞中,觉醒世人一百年

洞见
2024-06-02 22:00:20
宝马腰斩式大降价背后突出什么隐情?

宝马腰斩式大降价背后突出什么隐情?

看看娱乐与体育
2024-06-04 22:25:37
困境反转:隆基绿能、通威股份、TCL中环、特变电工、含金量谁高

困境反转:隆基绿能、通威股份、TCL中环、特变电工、含金量谁高

长风价值掘金
2024-06-04 20:25:17
问界某车主在4s店门口拉白色横幅:等车100天,开车60天变老款!

问界某车主在4s店门口拉白色横幅:等车100天,开车60天变老款!

火山诗话
2024-06-03 14:20:27
汪小菲小儿子一波未平一波又起?与张兰通话,疑似揭露了大S家教

汪小菲小儿子一波未平一波又起?与张兰通话,疑似揭露了大S家教

圈里的甜橙子
2024-06-04 22:23:55
再发达的国家也用不到那么多大学生,复旦教授一席话,扎心又现实

再发达的国家也用不到那么多大学生,复旦教授一席话,扎心又现实

妍妍教育日记
2024-06-03 13:08:26
24岁抗癌网红“桐妈”去世!死前只能躺地上,疑流产后不注意导致

24岁抗癌网红“桐妈”去世!死前只能躺地上,疑流产后不注意导致

裕丰娱间说
2024-06-04 08:29:09
妻子与老板去日本出差旅游,丈夫不敢多问,一个月后回来妻子慌了

妻子与老板去日本出差旅游,丈夫不敢多问,一个月后回来妻子慌了

星辰故事屋
2024-06-01 20:27:34
《墨雨云间》张檬上线,我委实愣了一下,以前演海兰珠时多美啊

《墨雨云间》张檬上线,我委实愣了一下,以前演海兰珠时多美啊

娱乐八卦木木子
2024-06-04 19:46:05
两性羞羞:为什么男人的丁丁普遍偏左,偏右会死吗?

两性羞羞:为什么男人的丁丁普遍偏左,偏右会死吗?

坟头长草
2024-06-03 12:00:01
央视报道:夜查电动车取得重大胜利!网友:何为胜利?敌人是谁?

央视报道:夜查电动车取得重大胜利!网友:何为胜利?敌人是谁?

娱乐的硬糖吖
2024-06-05 01:15:20
俄罗斯底线被突破,美国刚松口,乌军火箭炮就炸了俄本土

俄罗斯底线被突破,美国刚松口,乌军火箭炮就炸了俄本土

星弟爱侃国际文化
2024-06-04 22:24:34
4年7250万!李凯尔新合同曝光!可惜的是,他恐难留森林狼

4年7250万!李凯尔新合同曝光!可惜的是,他恐难留森林狼

鬼魅突破上篮
2024-06-04 15:29:41
阿娇还是不婚族,而前夫赖弘国喜晒二胎B超,结婚两年抱俩超幸福

阿娇还是不婚族,而前夫赖弘国喜晒二胎B超,结婚两年抱俩超幸福

麦大人
2024-04-11 12:59:06
上海偶遇李小冉拍戏,太震撼,太美了。

上海偶遇李小冉拍戏,太震撼,太美了。

小米虫侃人物
2024-06-05 02:07:41
胡塞武装暴打美国“艾森豪威尔”号航空母舰,创下五个第一

胡塞武装暴打美国“艾森豪威尔”号航空母舰,创下五个第一

低调看天下
2024-06-01 09:05:59
日本公布大消息!亚洲货币战争打完了?日元是怎么顶住的?

日本公布大消息!亚洲货币战争打完了?日元是怎么顶住的?

侃故事的阿蚌
2024-06-04 21:32:24
信用卡逾期了,接到派出所电话让去派出所该怎么办?

信用卡逾期了,接到派出所电话让去派出所该怎么办?

杨胜诉
2024-06-04 13:58:52
36岁,社区打电话催生三胎,我答:没空生,对方一句话差点气死我

36岁,社区打电话催生三胎,我答:没空生,对方一句话差点气死我

婉秋聊育儿
2024-06-03 11:16:04
6月3这一夜,球迷的世态炎凉,在王曼昱身上体现得淋漓尽致

6月3这一夜,球迷的世态炎凉,在王曼昱身上体现得淋漓尽致

开心体育站
2024-06-04 12:25:20
2024-06-05 06:20:49
moonfdd
moonfdd
福大大架构师每日一题
411文章数 7关注度
往期回顾 全部

科技要闻

斯坦福团队抄袭国产大模型后道歉 承诺撤下

头条要闻

5岁女童在机构练舞蹈摔倒致高位截瘫:只拿到20万赔偿

头条要闻

5岁女童在机构练舞蹈摔倒致高位截瘫:只拿到20万赔偿

体育要闻

从英国联赛到NBA,两个美国人相爱相杀

娱乐要闻

杨幂留言为热巴庆生,姐妹情深惹人羡

财经要闻

卷走53亿 浙江富豪全家跑路了

汽车要闻

2.0T+云辇-P+天神之眼 方程豹豹8还配软包内装

态度原创

游戏
旅游
手机
公开课
军事航空

《铸造厂》EA评测:教科书般的……同质化体验?"/> 主站 商城 论坛 自运营 登录 注册 《铸造厂》EA评测:教科书般的……同质化体验? 海星罐头 2...

旅游要闻

去年中国156人死于户外探险

手机要闻

三强争霸!一加13、OPPO Find X8、真我GT7 Pro,谁更值得期待?

公开课

近视只是视力差?小心并发症

军事要闻

俄车臣特种部队已转至哈尔科夫 指挥官:进入决战阶段

无障碍浏览 进入关怀版