Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

ซูเปอร์ซีเควนซ์ร่วมที่สั้นที่สุด


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