Longest Substring Without Repeating Characters
ابحث في سلسلة نصية عن مقاطع متتالية من الأحرف يظهر فيها كل حرف مرة واحدة فقط. في coddycode، يحتوي المقطع ycode على خمسة أحرف مختلفة، ولا يوجد مقطع أطول يتجنب التكرار، لذا فالإجابة هي 5.
ينجح فحص كل المقاطع الممكنة، لكنه بطيء. هناك طريقة أسرع تُبقي على نافذة بين موضعين لا تحتوي أبدًا على أحرف مكررة. حرّك الحافة اليمنى حرفًا واحدًا في كل مرة. عندما يكون الحرف الجديد موجودًا بالفعل داخل النافذة، انقل الحافة اليسرى مباشرةً إلى الموضع الذي يلي الموضع الذي شوهد فيه ذلك الحرف من قبل. إن تذكّر آخر موضع لكل حرف يجعل هذه النقلة فورية، لذا تُقرأ السلسلة النصية مرة واحدة فقط.
اكتب دالة باسم lengthOfLongestSubstring تستقبل سلسلة نصية s وتُرجع طول أطول سلسلة فرعية (مجموعة من الأحرف المتتالية) لا يظهر فيها أي حرف أكثر من مرة.
الأحرف الكبيرة والصغيرة أحرف مختلفة، لذا فإن a وA لا يُعدّان تكرارًا.
القيود: 1 <= s.length <= 5 * 10^4. تحتوي s على أحرف إنجليزية فقط (كبيرة وصغيرة) وأرقام.
الدالة
- arg1string
- تُرجعinteger
أمثلة
- المدخلات
- arg1 = "coddycode"
- المخرجات
- 5
- المدخلات
- arg1 = "racecar"
- المخرجات
- 4
- المدخلات
- arg1 = "a1b2a3b"
- المخرجات
- 5
+12 اختبارات مخفية عند الإرسال
تلميحات
افتحها واحدًا تلو الآخر. كل تلميح يكشف أكثر قليلًا.
المقطع الفرعي هو جزء متصل من السلسلة النصية، لذا فأنت تبحث عن أطول مقطع يمكنك تغطيته دون مواجهة الحرف نفسه مرتين.
احتفِظ بنافذة لها حد أيسر وحد أيمن. وسّعها من اليمين حرفًا واحدًا في كل مرة، وحرّك الحد الأيسر فقط عندما يكون الحرف الجديد موجودًا بالفعل داخل النافذة.
خزّن آخر فهرس ظهر فيه كل حرف. إذا كان الحرف الجديد قد ظهر آخر مرة عند الحافة اليسرى أو بعدها، فحرّك الحافة اليسرى إلى موضع بعد ذلك الفهرس بواحد. لا تتحرك الحافة اليسرى إلى الخلف أبدًا، والإجابة هي أوسع نافذة حصلت عليها على الإطلاق.
شرح كامل لهذه المسألة قادم قريبًا.
مسائل مشابهة
مسائل تعتمد على الأفكار نفسها. حلّ اثنتين أو ثلاث منها يثبّت النمط.
Python
def lengthOfLongestSubstring(s):
# اكتب الكود هناالحالة 1
الحالة 2
الحالة 3
المدخلات
arg1 = "coddycode"
المتوقع
5