بزرگترین زیررشته مشترک

با مسئله‌ی بزرگ‌ترین زیردنباله مشترک اشتباه نشود
در علوم کامپیوتر، مسئله بلندترین زیررشته مشترک برای یافتن بلندترین رشته(یا رشته‌هایی) که زیر رشته (یا زیررشته‌هایی)از دویاچندین رشته هستند،می‌باشد.این مسئله نباید با مسئله بلندترین زیردنباله مشترک اشتباه گرفته شود.(برای توضیحی در مورد تفاوت میان یک زیررشته و یک زیردنباله به زیررشته درمقابل زیردنباله رجوع کنید).
مثال
بلندترین زیررشته مشترک از رشته‌های "ABAB", "BABA و "ABBA" ، رشته‌های "AB" و "BA" از طول دو هستند.دیگر زیر رشته‌های مشترک "A" و "B" هستند.
ABAB
BABA
ABBA
تعریف مسئله
با دو رشته داده شده، از طول و از طول ،بلندترین رشته‌هایی که زیر رشته‌های هر دوی و هستند را پیدا کنید.یک تعمیم از این مسئله، مسئله زیررشته مشترک است.بارشته‌های داده شده جایی که و  .
الگوریتم‌ها
ما می‌توانیم طول‌ها و مکان‌های شروع بلندترین زیررشته‌های مشترک و را در زمان به کمک درخت پسوندی توسعه یافته بیابیم.پیداکردن آن‌ها به کمک برنامه نویسی پویاهزینه‌ای معادل دارد.راه حل مسئله تعمیم یافته،زمان و را می‌گیرد.
درخت پسوندی
بزرگترین زیررشته مشترک از یک مجموعه از رشته‌ها می‌تواند توسط ساختن یک درخت پسوندی تعمیم یافته برای رشته‌ها ، و سپس یافتن عمیق‌ترین نودهای داخلی که گره‌های برگی که از همه رشته‌ها در درخت پایین اشان دارند ،یافت شود.
شکل سمت چپ درخت پسوندی برای رشته‌های "ABAB" ،"BABA" و"ABBA" است که توسط پایانه‌های یکتای رشته‌ها خالی شده‌اند، تا "ABAB$0", "BABA$1" و "ABBA$2" شوند.گره‌هایی که "A", "B", "AB" و "BA" را نمایش می‌دهند همگی برگ‌های فرزندی از همه رشته‌ها دارند،که با0،1 و 2 شماره‌گذاری شده‌اند.
ساختن درخت پسوندی زمان time می‌گیرد(طول الفبا ثابت است).اگردرخت از پایین به بالا با یک بردار بیتی که می‌گوید چه رشته‌هایی پایین هر گره دیده شده‌اند،پیمایش شود،مسئله K زیررشته مشترک می‌تواند در زمان حل شود.اگردرخت پسوندی برای زمان ثابت بازیابی کم‌ترین پدران مشترک آماده شود،می‌تواند در زمان time. حل شود.
برنامه‌نویسی پویا
درابتدا بزرگترین پسوند مشترک رابرای همه جفت پیشوندهای رشته بیابید.بزرگترین پسوند مشترک
\mathit{LCSuff(S_{1..p, T_{1..q) =
\begin{cases
\mathit{LCSuff(S_{1..p-1, T_{1..q-1) + 1 - \mathrm{if \; Sp = Tq \\
0 - \mathrm{otherwise.
\end{cases
است.
برای مثال رشته‌های "ABAB" و "BABA":
A
B
A
B
0
0
0
0
0
B
0
0
1
0
1
A
0
1
0
2
0
B
0
0
2
0
3
A
0
1
0
3
0
حداکثراین طولانی‌ترین پسوندهای مشترک ازپیشوندهای مشترک باید طولانی‌ترین زیررشته‌های مشترک از S و T باشند.این‌ها در جدول،باقرمز،روی قطرها نمایش داده شده‌اند.برای این مثال طولانی‌ترین زیر رشته‌های مشترک "BAB" و "ABA" هستند
\mathit{LCSubstr(S, T) = \max_{1 \leq i \leq m, 1 \leq j \leq n \mathit{LCSuff(S_{1..i, T_{1..j) \;
این مورد می‌تواند به بیش از دو رشته با اضافه کردن ابعاد بیشتر به جدول بسط داده شود.
شبه کد
شبه کد پایین مجموعه بزرگترین زیر رشته‌های مشترک رامیان دورشته با برنامه نویسی پویا می‌یابد.
function LCSubstr(S , T )
L := array (1..m, 1..n)
z := 0
ret := {
for i := 1..m
for j := 1..n
if Si = Tj
if i = 1 or j = 1
Li,j := 1
else
Li,j := Li-1,j-1 + 1
if Li,j> z
z := Li,j
ret := {
if Li,j = z
ret := ret ∪ {S
else Li,j=0;
return ret
این الگوریتم در زمان اجرا می‌شود. متغیر z برای نگهداری طول بزرگترین زیررشته مشرک که ناکنون یافت شده‌است به کار می‌رود.مجموعه ret برای نگهداری مجموعه‌ای از رشته‌ها که از طول z هستند به کار می‌رود.مجموعه ret می‌تواند به‌طور کارایی توسط انباره کردن اندیس i ذخیره شود،که آخرین کاراکتر از طولانی‌ترین زیررشته مشترک(از اندازه Z) به جای S است.بنابراین همه طولانی‌ترین زیررشته‌های مشترک به ازای هر i در ret , S خواهند بود.
ترفندهای زیر می‌تواند برای کاهش حافظه در یک اجرا به کار رود.
فقط آخرین و سطرکنونی جدول برنامه نویسی پویارابرای ذخیره حافظه ( به جای نگاه دارید.
فقط مقادیر غیر صفر را در سطرها نگهداری کنید.این امر می‌تواند توسط استفاده از جداول هش به جای آرایه‌ها انجام شود.این امر برای الفباهای بزرگ مفید است.
طولانی‌ترین زیررشته‌های پالیندروم
متابع
Dynamic programming implementations in various languages on wikibooks