- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我将复习在寻找两个等长字符串的最长公共(public)子序列的上下文中讨论动态规划的笔记。有问题的算法输出长度(不是子字符串)。
所以我有两个字符串,比如说:
S = ABAZDC,T = BACBAD
最长公共(public)子序列是 ABAD(子串不必是相邻的字母)
算法如下,其中LCS[i, j]表示S[1..i]和T[1..j]的最长公共(public)子序列:
if S[i] != T[j] then
LCS[i, j] = max(LCS[i - 1, j], LCS[i, j - 1])
else
LCS[i, j] = 1 + LCS[i - 1, j - 1]
我的笔记声称您可以填写一个表格,其中每个字符串都沿着一个轴书写。像这样的东西:
B A C B A D
A 0 1 1 1 1 1
B 1 1 1 2 2 2
一个...
Z
D
C
两个问题:
1) 我们实际上是如何开始填写这张表的。算法是递归的,但似乎没有提供基本情况(否则我只会调用 LCS[5, 5])?笔记声称你可以用 i 和 j 做两个简单的循环,并在恒定时间内填写每个点......
2) 我们如何修改算法以使最长公共(public)子序列为相邻字母?我的想法是,一旦我发现 S 中的下一个字母与 T 中的下一个字母不匹配,我就必须将当前子序列的长度重置为 0。但这很棘手,因为我想跟踪最长的到目前为止(我看到的第一个子序列可能是最长的)。所以也许我会有一个额外的参数,longestThusFar,当我们最初调用我们的算法并在后续调用中更改时,它是 0。
有人可以让这个更严格一点吗?
谢谢!
最佳答案
首先,算法是递归的,但实现总是迭代的。换句话说,我们没有显式地从函数本身调用同一个函数(递归)。
我们使用已经填充的表条目来补偿递归。
比如说,你有两个长度为 M 的字符串。
然后定义一个表的维度(M+1)X(M+1)。
for(i = 0 to M)
{
LCS[0][i]=0;
}
for(i = 1 to M)
{
LCS[i][0]=0;
}
然后你得到一张像这样的 table
B,A,C,B,A,D
0,0,0,0,0,0,0
A 0
B 0
A 0
Z 0
D 0
C 0
0th col中的每个零表示如果不考虑字符串BACBAD的字符,则LCS的长度= 0。
第 0 行中的每个零表示如果不考虑字符串 ABAZDC 的字符,则 LCS 的长度 = 0。
其余条目使用您提到的规则填写。
for(i = 1 to M)
{
for(j = 1 to M)
{
if S[i-1] != T[j-1] then
LCS[i, j] = max(LCS[i - 1, j], LCS[i, j - 1])
else
LCS[i, j] = 1 + LCS[i - 1, j - 1]
}
}
注意它是 S[i-1] != T[j-1] 而不是 S[i] != T[j] 因为当你填充LCS[i,j],您总是比较S 的第 i-1 个字符和 T 的第 j-1 个字符。
LCS 的长度由LCS[M,M] 给出。
理解这一点的最好方法是亲自尝试。
在回答你的第二个问题时,你不需要对算法做太多修改。
解决方案在于用于检索 LCS 的表。
为了检索 LCS,我们创建了一个额外的 T 表,其中包含维度为 MXM 的字符。我们修改算法如下。
for(i = 1 to M)
{
for(j = 1 to M)
{
if S[i-1] != T[j-1] then
{
LCS[i, j] = max(LCS[i - 1, j], LCS[i, j - 1])
if(LCS[i - 1, j]>=LCS[i, j - 1])
T[i-1][j-1]='u'//meaning up
else T[i-1][j-1]='l'//meaning left
}
else
{
LCS[i, j] = 1 + LCS[i - 1, j - 1]
T[i-1][j-1]='d'//meaning diagonally up
}
}
}
现在,为了知道两者共有的最长子串(OF ADJACENT LETTERS),沿对角线遍历 T。
长度 = 在对角线上找到的连续 d 的最大数量。
任意方阵NXN的对角线遍历由.
包含主对角线的下三角
j=N-1
while(j>=0)
{
i=j;k=0;
while(i <= N-1)
{
entry T[i][k];
++i;++k
}
--j;
}
上三角
j=1;
while(j<=N-1)
{
i=j;k=0;
while(i<=N-1)
{
entry T[k][i];
++k;++i;
}
--j;
}
关于algorithm - 动态规划 : Longest Common Subsequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32288223/
所以现在我有一个像这样的字符串列表{a, b, c, d, Justin, Connor, BYE1, BYE2} 现在我正在尝试用子序列 (0,3) 中的“BYE”过滤掉列表中的字符串。但是,如果我
我不知道在这里问这个问题是否合适,如果不合适,请见谅。 我得到了一个序列 ALPHA,例如: A B D Z A B X 我得到了 ALPHA 的子序列列表,例如: A B D B D A B D Z
优化 O(n^2)算法到O(n log n) . 问题陈述 给定数组 A的 n正整数。将数组分成长度不大于k的连续子序列使得每个子序列的最大值之和最小。这是一个例子。 如果n = 8和 k = 5和数
对于大多数 Swift Collections , 索引 Collection's SubSequence与底座兼容 Collection . func foo(_ buffer: T) -> T.I
我正在尝试解决 problem 的变体我之前问过: Given a string of parentheses (length <= 1,000,000) and a list of range qu
题目地址:https://leetcode.com/problems/distinct-subsequences/description/ 题目描述 Given a string S and a
比如说,String str = "hello world";要,打招呼,我们可以使用 str.subSequence(0, 5)。如果它是一个从 0 开始的索引字符串,那么为什么我们不把 str.s
所以我读了this answer和 this answer关于 subSequence() 和 subString() 之间的区别,我知道两者之间的唯一区别是返回类型。事实上,subSequence(
题目地址:https://leetcode.com/problems/increasing-triplet-subsequence/description/ 题目描述: Given an unso
题目地址:https://leetcode.com/problems/longest-increasing-subsequence/description/ 题目描述 Given an unsor
题目地址:https://leetcode.com/problems/longest-palindromic-subsequence/description/ 题目描述 Given a strin
我在使用 Java 和 Android Studio 时遇到问题;以下代码是一个退格按钮: else if(view == btnBackspace){ int expressionLengt
import requests for i in range(3): g = requests.get('http://some-url/') print "request done"
我已经阅读了 LCS 问题的解决方案。但是现在有一个最长相似子序列问题:序列 C 是两个序列 A、B 的相似子序列当且仅当 C 是 A 的子序列并且我们最多可以替换 C 中的 K 个元素使得 C 是
我将复习在寻找两个等长字符串的最长公共(public)子序列的上下文中讨论动态规划的笔记。有问题的算法输出长度(不是子字符串)。 所以我有两个字符串,比如说: S = ABAZDC,T = BACBA
我们可以用DP(动态规划)找到两个字符串的LCS(最长公共(public)子序列)。通过跟踪 DP 表,我们可以获得 LCS。但是,如果存在不止一个濒海战斗舰,我们如何获得所有的濒海战斗舰呢? 例子:
N4567 标准禁止对先前在条件中声明的名称进行某些类型的重新声明,如下所示——根据标准(§3.3.3/4): Names declared in the for-init-statement, th
题目地址:https://leetcode.com/problems/longest-uncommon-subsequence-i/description/ 题目描述 Given a group
题目地址:https://leetcode.com/problems/count-different-palindromic-subsequences/description/ 题目描述 Give
题目地址:https://leetcode.com/problems/distinct-subsequences-ii/description/ 题目描述 Given a string S, co
我是一名优秀的程序员,十分优秀!