LengthOfLongestSubstring

Published at 2021-11-15

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        length = len(s)
        left = 0
        maxVal = 0
        for right in range(length):
            findIdx = s[left:right].find(s[right])
            if findIdx == -1:
                maxVal = max(maxVal, len(s[left:right]) + 1)
            else:
                left += findIdx + 1

        return maxVal

    # left랑 right 두개를 사용할거임
    # s의 길이만큼 돌린게 right이고
    # left는 지금까지의 서브리스트중에 새로 추가될 값이(right) 들어있지 않다면 left를 변화시키지 않고 maxVal을 갱신해줌
    #                                                     들어있다면 left를 그 중복값이 있는 그 다음 인덱스부터 새로 검사하기 위해
    #                                                     left + 중복값이 있는 인덱스 + 1 로 갱신 해줄거임
    # 예를들어 pwwkew를 보자면
    # 맨 첨에는 p에(0번) w(1번)가 없으니까 maxVal은 2가 됨.
    # 근데 그 다음 2번인덱스 w가 pw(s[0:1])에 있으니까 left = left+1(중복되는w의 인덱스)+1해줌
    # 그래서 left는 2이 되었음
    # 계속해서 left가 2이니까... 쓰기 귀찮
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
  let max = 0;
  let l = 0;
  for (let r = 0; r < s.length; r++) {
    const idx = s.slice(l, r).indexOf(s[r]);
    if (idx === -1) {
      max = Math.max(max, r + 1 - l);
    } else {
      l += idx + 1;
    }
  }
  return max;
};