آرین سليمان زاده
  • الرئيسية
  • المدونة
  • البودكاست
  • الفيديوهات
  • المكتبة
  • تواصل
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
اللوحة•تواصل سريع

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

احجز موعداً

أرسل رسالة قصيرة — سأرد في أقرب وقت ممكن.

LinkedInاستجابة سريعة
الرئيسية/المقالات/ما هي Longest Common Substring؟ إيجاد أطول جزء متصل مشترك باستخدام Dynamic Programming
Algorithmsمقال

ما هي Longest Common Substring؟ إيجاد أطول جزء متصل مشترك باستخدام Dynamic Programming

تهدف خوارزمية Longest Common Substring إلى إيجاد أطول سلسلة متصلة تظهر في نصين معاً. نشرح الفكرة باستخدام Dynamic Programming مع TypeScript والتعقيد والتطبيقات.

١٩ أغسطس ٢٠٢٦7 دقيقة قراءة21 المشاهدات
#Algorithms#Longest Common Substring#String Algorithms#Dynamic Programming#TypeScript

Arian Soleimanzadeh

Software Engineer & Researcher

جدول Dynamic Programming يوضح Longest Common Substring بين سلسلتين

Arian Soleimanzadeh

ذكاء اصطناعي · برمجة · منتج

بحث + هندسة
في هذه الصفحة
ما هو Substring؟Dynamic ProgrammingمثالTypeScriptالتعقيدالفرق عن Longest Common Subsequenceتطبيقات عمليةعدة إجابات متساويةسؤال مقابلاتالخلاصة

تهدف مسألة Longest Common Substring إلى إيجاد أطول جزء متصل يظهر داخل سلسلتين.

مثال:

Code
12
ABABC
BABCA

أطول جزء مشترك متصل هو:

Code
1
BABC

وبالتالي:

Code
1
Length = 4

الكلمة المهمة هنا هي متصل. يجب أن تظهر جميع الأحرف بجانب بعضها من دون انقطاع.

ما هو Substring؟

في السلسلة:

Code
1
ABCDE

تعد هذه أمثلة صحيحة:

Code
123
ABC
BCD
DE

أما:

Code
1
ACE

فليست Substring لأن الأحرف ليست متجاورة.

Dynamic Programming

نعرّف:

Code
1
dp[i][j]

على أنه طول أطول Substring مشترك ينتهي تحديداً عند a[i - 1] وb[j - 1].

إذا كان الحرفان متساويين:

Code
1
dp[i][j] = dp[i - 1][j - 1] + 1

أما عند الاختلاف:

Code
1
dp[i][j] = 0

سبب الصفر هو أن Substring يجب أن يبقى متصلاً، وأي mismatch يقطع السلسلة الحالية.

مثال

للسلسلتين:

Code
12
a = ABABC
b = BABCA

يمكن أن يكون جدول DP:

Code
123456
      B  A  B  C  A
A     0  1  0  0  1
B     1  0  2  0  0
A     0  2  0  0  1
B     1  0  3  0  0
C     0  0  0  4  0

أكبر قيمة هي 4 وتمثل BABC.

TypeScript

TypeScript
123456789101112131415161718192021222324252627
function longestCommonSubstring(
  a: string,
  b: string
): string {
  const dp = Array.from(
    { length: a.length + 1 },
    () => new Array(b.length + 1).fill(0)
  );

  let maxLength = 0;
  let endIndex = 0;

  for (let i = 1; i <= a.length; i++) {
    for (let j = 1; j <= b.length; j++) {
      if (a[i - 1] === b[j - 1]) {
        dp[i][j] = dp[i - 1][j - 1] + 1;

        if (dp[i][j] > maxLength) {
          maxLength = dp[i][j];
          endIndex = i;
        }
      }
    }
  }

  return a.slice(endIndex - maxLength, endIndex);
}

التعقيد

إذا كان طول السلسلتين n وm:

Code
12
Time Complexity: O(n × m)
Space Complexity: O(n × m)

ويمكن تقليل الذاكرة إلى:

Code
1
O(min(n, m))

باستخدام صفين فقط من جدول DP.

الفرق عن Longest Common Subsequence

في Substring يجب أن تكون الأحرف متجاورة.

أما Subsequence فيسمح بتجاوز بعض الأحرف مع الحفاظ على الترتيب.

مثلاً:

Code
12
ABCDEF
ACEF

يمكن أن تكون ACEF عبارة عن Common Subsequence، لكنها ليست Substring في ABCDEF.

أهم فرق في DP هو أنه عند mismatch في Longest Common Substring نكتب:

Code
1
dp[i][j] = 0

أما في LCS فعادة نأخذ أفضل نتيجة من الحالات المجاورة.

تطبيقات عملية

يمكن استخدام الفكرة في:

  • String Similarity
  • Data Cleaning
  • CRM Deduplication
  • DNA Sequence Analysis
  • مقارنة الإصدارات
  • اكتشاف الأجزاء المتكررة في المستندات
  • Log Analysis

في CRM مثلاً قد تساعد Substring طويلة مشتركة بين اسمين في اكتشاف سجلين متشابهين، لكن يجب دمجها مع Email وPhone ومقاييس أخرى.

عدة إجابات متساوية

قد توجد أكثر من Substring لها نفس الطول الأقصى.

مثلاً:

Code
12
abcXYZ123
abcABC123

كل من:

Code
12
abc
123

له طول 3.

سؤال مقابلات

السؤال الشائع هو إيجاد طول أو قيمة أطول Substring مشتركة بين سلسلتين.

يجب الانتباه إلى:

  • الاتصال Contiguity
  • تعريف حالة DP
  • إعادة القيمة إلى صفر عند mismatch
  • تخزين Max Length
  • التعقيد O(n × m)

الخلاصة

Longest Common Substring تجد أطول جزء متصل مشترك بين سلسلتين.

العلاقة الأساسية:

Code
12
Match    → dp[i - 1][j - 1] + 1
Mismatch → 0

والحل التقليدي باستخدام Dynamic Programming يعمل في زمن O(n × m).

في هذه الصفحة
ما هو Substring؟Dynamic ProgrammingمثالTypeScriptالتعقيدالفرق عن Longest Common Subsequenceتطبيقات عمليةعدة إجابات متساويةسؤال مقابلاتالخلاصة

تفاصيل المقال

بيانات النشر ووقت القراءة وعدد المشاهدات.

تاريخ النشر

١٩ أغسطس ٢٠٢٦

آخر تحديث

١ نوفمبر ٢٠٢٦

وقت القراءة

7 دقيقة قراءة

المشاهدات

21

الكاتب

Arian Soleimanzadeh

المقال السابق

ما هي خوارزمية Kosaraju وما المشكلة التي تحلها؟

المقال التالي

ما هو Palindrome؟ فحص السلاسل المتناظرة باستخدام Two Pointers وTypeScript

آرین سليمان زاده

معرض أعمال شخصي يركز على هندسة الويب الحديثة، وأنظمة الواجهات، ومنتجات الذكاء الاصطناعي العملية — كود نظيف، وتصميم نقي.

روابط سريعة

  • نبذة
  • المدونة
  • المكتبة
  • تواصل

تواصل

  • soleimanzadeh.a.work@gmail.com
  • soleimanzadeh.uni@gmail.com

التوفر: أيام الأسبوع

عادةً يتم الرد خلال 24 ساعة.

النشرة البريدية

احصل على تحديثات حول المقالات، والمشاريع، والإصدارات الجديدة.

© 2026 ariansoleimanzadeh.dev — جميع الحقوق محفوظة.

لينكدإن