반복없이 문자 LeetCode- 긴 문자열 (슬라이딩 윈도우 방식)

문자열을 감안할 때, 당신은 반복되는 문자의 긴 문자열의 하위 길이를 포함하지 않는 알아보십시오.

예 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


滑动窗口展示的动态图片请参考:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/hua-jie-suan-fa-3-wu-zhong-fu-zi-fu-de-zui-chang-z/

추천

출처www.cnblogs.com/yinbiao/p/11271893.html