我对Python很陌生,它是我的第一个编程语言,而且我想进行一些手动数据结构操作和游戏。
我最近一直在学习解决LCS问题的基本算法,而且我理解它是如何工作的,除了一行代码,我出于某些奇怪的原因似乎无法说服自己我完全掌握
这是我用来学习的代码,在我无法完全理解之后。
编辑2:无论如何使用两个整数列表的输入来完成这项工作?**我发现我正确地理解了我的原始问题,但有人知道如何使用*来完成这项工作*列表整数?我尝试将S和T转换为一串逗号分隔值,这些值用于匹配某些字符,但即使这样,它在大多数测试用例中也很少有效。我不确定为什么它不会,因为它仍然只是两个字符串被比较,但用逗号。
def lcs(S,T):
m = len(S)
n = len(T)
counter = [[0]*(n+1) for x in range(m+1)]
longest = 0
lcs_set = set()
for i in range(m):
for j in range(n):
if S[i] == T[j]:
c = counter[i][j] + 1
counter[i+1][j+1] = c
if c > longest:
lcs_set = set()
longest = c
lcs_set.add(S[i-c+1:i+1])
elif c == longest:
lcs_set.add(S[i-c+1:i+1])
return lcs_set
现在我的问题是理解是行:lcs_set.add(S [i-c + 1:i-1])
我知道当找到匹配时计数器会递增,以给最长子串的长度。所以,为了方便起见,如果S = Crow且T = Crown,当你到达w时,最后一次匹配,计数器增加到4,而我在S的索引3。
这是否意味着我将其读作:i(S上的index3,W) - c(4),所以3-4 = -1,所以3-4 + 1 = 0(在C)和切片的右侧:i(3)+ 1 = 4(N,但显然不包括在内),这意味着我们以S [0:4],Crow结束, LCS_Set ?
如果是这种情况,我想我很困惑为什么我们要将整个子字符串添加到集合中,而不仅仅是最新匹配的字符?
如果我理解正确,它正在使用当前匹配的子字符串的整个片段更新 LCS_set ,所以如果它在第二个匹配项R上,计数器将会在2,我会在1,它会说S [1-2 + 1:i(1)+1],所以1-2 = -1,-1 + 1 = 0(C)到i(1)+1 = 2(留下S [0:2]或CR),所以每次使用整个子字符串更新集合,而不仅仅是当前索引。
这不是一个真正的问题,我只是想确保我能正确理解这一点。
我真的很感激任何输入,或任何人可能会看到我当前逻辑的提示!!
编辑:
我刚刚意识到我完全忘记了C处的位置是当前的计数器编号,因此它显然不会用当前的最大匹配数更新LCS_set,并且它无法用只是当前匹配的字母,所以它必须采用子字符串的片段来更新LCS_Set。 提前谢谢!