ซูเปอร์ซีเควนซ์ร่วมที่สั้นที่สุดคือลำดับที่แต่ละองค์ประกอบของลำดับที่กำหนดทั้งสองมีอยู่ กล่าวอีกนัยหนึ่ง เราสามารถพูดได้ว่าสองสตริงที่ให้มา ทั้งสองเป็นลำดับย่อยของ Super-Sequence ทั่วไปที่สั้นที่สุด
เมื่อไม่มีอักขระทั่วไปในสองสตริง เราก็สามารถเชื่อมเข้าด้วยกันเพื่อรับ Super-sequence แต่เมื่อพวกมันมีอักขระทั่วไป ขั้นแรกเราต้องค้นหาสตริงที่ยาวที่สุด จากนั้นจึงเพิ่มอักขระพิเศษของสตริงอื่น
อินพุตและเอาต์พุต
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