주제 :
스테이 버튼 원래 제목 링크 : 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을; } };