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