문자열을 감안할 때, 당신은 반복되는 문자의 긴 문자열의 하위 길이를 포함하지 않는 알아보십시오.
예 1 :
입력 : "abcabcbb"
출력 : 3
설명 : 반복없이 문자의 긴 문자열이 "ABC"는, 그래서 그 길이가 3이기 때문입니다.예 2 :
입력 : "BBBBB"
출력 : 1
설명 : 길이가 1이되도록, "b"를하지 않고 문자를 반복 가장 긴 문자열이 있기 때문에.예 3 :
입력 : "pwwkew"
출력 : 3
설명 : 길이가 3, 그래서 "wke"없이 문자를 반복 가장 긴 하위 문자열이 있기 때문에.
당신의 대답은 길이의 문자열이어야 있습니다 "pwke은"서브 순서가 아니라 문자열입니다.출처 : 유지 버튼 (LeetCode)
링크 : https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
분석 :
이러한 세 가지 방법은 광범위에 속하는되는 슬라이딩 윈도우 방법은 일부 다른뿐만 아니라 조작의 데이터 구조 것을 제외
방법 1 : 문자 집합 문자열의 존재 여부를 판정한다
폭력의 캐릭터의 복잡도를 결정하는 어떤 캐릭터의 존재는 폭력 시간 복잡도 결과 문자열을 통과 할 필요는 O는 문자열이 서브 세트의 판정이 채용 될 수 있으며, 이러한 존재 여부 (N ^ 2)이다 문자 서브 스트링 O의 시간 복잡도가 있는지를 판단한다 (1)
시간 복잡도 : O (2 * N)는 = O (N)은, 최악의 경우, 각 캐릭터는 i와 j 번 액세스된다.
공간 복잡도 : 세트의 크기가되도록 공간 복잡도 O (분 (N, M)), 문자열의 길이 N과 설정된 크기 m에 의존
클래스 솔루션 { 공개 : INT의 lengthOfLongestSubstring ( 문자열 STR) { 경우 (캐릭터 == "" ) 반환 0 ; 설정 < 문자 > SS 단계; int로 I = 0 , J = 0 , N = str.length ()를; INT ANS = - 1 ; 반면 (나는 <N && J < N) { 경우 (ss.find (STR [J]) == ss.end ()) { ss.insert (STR [J ++ ]); ANS= 최대 (ANS, J, I); } 그렇지 { ss.erase (STR의 [I ++ ]); } } 반환 ANS; } };
실행 시간 : 60 MS
방법 2 : 난 비약되도록 각 문자의 마지막에 나타나는 맵 또는 배열 인덱스 위치는 저장된
의 S에서는 [I] S [J] 문자 S 반복되는 S [K] 내에있는 경우 [J + 1] 다음 (순방향 하나씩) 서서히 I 증가를 설정하지만, 경우에 매핑하면 각 문자의 마지막 항목의 인덱스 위치가 저장되기 때문에 사용자는 도약 속하는 난 + 1, k는 건너 뛸 수
알파벳 크기 : m
시간 복잡도 : O (N * 2 ) = O (N)
공간 복잡도 : O (m)
클래스 솔루션 { 공개 : INT의 lengthOfLongestSubstring ( 문자열 STR) { 경우 (캐릭터 == "" ) 반환 0 ; 지도 < CHAR , INT > mm; int로 I = 0 , J = 0 , N = str.length ()를; INT ANS = - 1 ; 대 (I = 0 , J = 0 , N J <; J ++ ) { 경우 (mm.find (STR [J])! = mm.end ()) { I= 최대 (I, mm [STR [J]); } ANS = 최대 (ANS, J-I는 + 1 ); mm [STR [J]] = J + 1 ; } 반환 ANS; } };
실행 시간 : 32 MS
방법 세 : 배열 저장 문자 인덱스는, 시작의 시작을 나타내는 것은 문자열의 어떤 중복이 없다
원래 문자의 위치는 시작보다 크게 나타난 경우, 업데이트를 시작
I-시작 = 문자열의 길이는 반복하지 않는다
이 방법은, 문자, 직류가 문자의 마지막 위치 결정이 처음 등장보다 큰지 여부 맵 또는 설정된 문자열 검색 동작을 사용하기위한 필요성을 없애
시간 복잡도 : O (N)
공간 복잡도 : O (m)은 m 문자 집합의 크기
class Solution { public: int lengthOfLongestSubstring(string str) { vector<int> v(300,-1); int ans=0; int n=str.length(); int start=-1; for(int i=0; i<n; i++) { if(v[str[i]]>start) { start=v[str[i]]; } v[str[i]]=i; ans=max(ans,i-start); } return ans; } };
执行时间:8 ms