最短公共超序列
最短的公共超序列是其中两个给定序列的每个元素都存在的序列。换句话说,我们可以说给定的两个字符串都是最短公共超序列的子序列。
当两个字符串中没有公共字符时,我们可以简单地将它们连接起来以获得超序列。但是,当它们具有一些公共字符时,首先我们必须找到最长的字符串,然后在另一个字符串中添加额外的字符。
输入输出
Input: Two strings. “ABCDEF” and “XYDEF” Output: The length of the shortest common super-sequence. Here the super-sequence is “ABCDEFXY”. So the length is 8.
算法
superSeq(str1, str2)
输入:两个字符串str1和str2。
输出:查找超序列的长度。
Begin
m := length of str1
n := length of str2
define table named seqTab of size (m+1 x n+1)
for i := 0 to m, do
for j := 0 to n, do
if i = 0, then
seqTab[i, j] := j
else if j = 0, then
seqTab[i, j] := i
else if str1[i-1] = str2[j-1], then
seqTab[i, j] := 1 + seqTab[i-1, j-1]
else
seqTab[i, j] := 1 + minimum of seqTab[i-1, j] and seqTab[i, j-1]
done
done
return seqTab[m, n]
End示例
#include<iostream>
using namespace std;
int min(int a, int b) {
return (a<b)?a:b;
}
int superSeq(string str1, string str2) {
int m = str1.size();
int n = str2.size();
int supSeqTable[m+1][n+1];
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (!i)
supSeqTable[i][j] = j; //shortest supersequence length is j
else if (!j)
supSeqTable[i][j] = i; //shortest supersequence length is i
else if (str1[i-1] == str2[j-1])
supSeqTable[i][j] = 1 + supSeqTable[i-1][j-1];
else
supSeqTable[i][j] = 1 + min(supSeqTable[i-1][j], supSeqTable[i][j-1]);
}
}
return supSeqTable[m][n];
}
int main() {
string first = "ABCDEF";
string second = "XYDEF";
cout << "Length of the shortest supersequence is " << superSeq(first, second);
}输出结果
Length of the shortest supersequence is 8
热门推荐
10 对患者生日祝福语简短
11 结婚祝福语简短装备
12 周岁祝福语学生文案简短
13 订婚领证祝福语简短精辟
14 导师获奖祝福语大全简短
15 新婚购房祝福语简短精辟
16 牛年祝福语简短的爱人
17 送芒果的祝福语简短
18 送给学长毕业祝福语简短