C ++ 및 이중 포인터 벡터 무료 슬라이딩을 반복 문자 긴 문자열을 사용 - 알고리즘의 전원 버튼

주제 :

스테이 버튼 원래 제목 링크 : https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

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

예 1 :

입력 : "abcabcbb"

출력 : 3 

설명 : 반복없이 문자의 긴 문자열이 "ABC"는, 그래서 그 길이가 3이기 때문입니다.
예 2 :

입력 : "BBBBB"
출력 : 1
설명 : 길이가 1이되도록, "b"를하지 않고 문자를 반복 가장 긴 문자열이 있기 때문에.
예 3 :

입력 : "pwwkew"

출력 : 3

설명 : 가장 긴 하위 문자열 "wke"없이 문자가 반복되기 때문에 길이가 3이기 때문입니다.
당신의 대답은 길이의 문자열이어야 있습니다 "pwke은"서브 순서가 아니라 문자열입니다.



 문제 해결 :

방법 1 : 벡터 컨테이너 사용
사용될 때 실행 : 20 MS이다 , 모든 CPP 제출 이길 66.62 % 사용자의
메모리 소비 : 9.6 MB를 모두 CPP 제출에 이길 85.78 % 이용자의
방법 II : 미끄럼 이중 포인터
실행 : 4 MS는 , 모든 CPP 제출에서 패배 99.47 % 사용자의
메모리 소비 : 9메가바이트 , 모든 CPP 제출에서 패배 95.92 % 의 사용자

 

방법 1이 :
, 첫 번째 업데이트는 문자열 최대 mlen을 반복하지 않는다 중복, 반복되지 않는 문자가 벡터의 끝에 적립되지 않습니다 전달 된 문자열의 각 문자의 벡터의 모든 내용이 있었다 된 후, 벡터 반복 이 mlen 반환되기 전에 문자 내용을 삭제됩니다.

소거 함수는 벡터 벡터를 제거하는 [제 마지막) 요소 : 반복자 소거 (제 1 반복자 반복자 마지막). 반복자 유형 매개 변수를 참고 값은 사용할 수 없습니다. 벡터 기능의 사용 : 반복자 시작 (). 첫 번째 요소로 돌아 가기 벡터 헤드 포인터.

: 벡터 관련 내용을 참조 할 수 https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html

클래스 해결 {
 공개 :
     INT의 lengthOfLongestSubstring ( 문자열 들) {
         INT N = s.length ();
        벡터 < 문자 > STR;
        INT mlen = 0 ;
        // 扫描스트링들 
        에 대한 ( int로 I = 0 ; I <N은, 내가 ++ ) {
              의 C =에서 S [I];
            // 扫描벡터 STR 
             ( INT m = str.size () - 1 , m> = 0 ; M-- ) {
                 경우 (c == STR [m]) {
                     // 更新mlen 
                    경우 (mlen < str.size ())
                        MLEN = str을.
                     // 이전 캐릭터와 자신의 반복되는 문자를 삭제합니다. 선두 벡터 () 함수 제어부 삭제 
                    (str.begin () str.begin ()의 + m +를 str.erase을 1. )
                     BREAK를 ;
                }
            }
            str.push_back (c);
        }
        경우 (mlen < str.size ())
            mlen = str.size ();
        반환 mlen을;
    }
};

 

 

두 번째 방법 :
헤드 포인터와 테일 포인터와 2 이상 (S)의 문자 수는 S + 1과 머리의 선두를 가리 키도록하면, 두 문자의 비교에있어서, 상기 포인터와 테일 포인터 비교 사이 스캔 포인터를 이동.
오직 두 가지 상황, 어떤 일시 : 범위 [머리, 꼬리) 사이의 문자의 마지막 문자가 반복 2 : 없음.
스캔 대비를 계속, 최대 길이 MLEN, 반복 문자 다음 위치, 꼬리 포인터 후 변화에 대한 헤드 포인터를 가리키는를 업데이트 할 때 1.가 발생했습니다.
이 만남의 상황은 움직이지 않는 헤드 포인터, 꼬리 포인터의 이동은 계속됩니다.

클래스 솔루션 {
 공개 :
     INT의 lengthOfLongestSubstring ( 문자열 S) {
         INT의 길이 = s.length은 ();
         // 0,1 직접 두 번 포인터가없는 장소의 문자열을 의미 돌려줍니다. 
        IF (! 길이)
             복귀  0 ;
         IF (길이 == 1 )
              1 ;
         // 헤드 포인터 P, mlen 적어도 하나의 최대 길이. 
        INT P = 0 , = MLEN 1. ;
         // 꼬리 포인터 종료 
        에 대한 ( INT의 끝 = 1. , 끝 <길이, 끝 ++) {
             들어 ( INT의 AIM이 = P; AIM <최종; AIM ++ ) {
                 // . 사례 1은 
                IF (S [AIM은] == S는 [종료]) {
                     // 헤드 포인터 P 업데이트 
                    P = AIM +를 1. ;
                     // 최대 길이를 갱신 MLEN 
                    IF (MLEN <(최종 AIM))
                        mlen = 최종 목표;
                    휴식 ;
                }
            }
            // 경우 2. +1 있도록 꼬리 포인터를 계산합니다. 
            IF (MLEN <P + 최종 . 1 )
                mlen = 최종 P + 1 ;
        }
        반환 mlen을;
    }
};

 

추천

출처www.cnblogs.com/foxer-z/p/11687281.html