Lituo 3. 반복 없는 가장 긴 하위 문자열, C++ 비순차 집합 솔루션

주어진 문자열 s에서 반복되는 문자를 포함하지 않는 가장 긴 하위 문자열의 길이를 찾으십시오.

예 1:

입력: s = "abcabcbb"
출력: 3 
설명: 반복되는 문자가 없는 가장 긴 하위 문자열은 "abc"이므로 길이는 3입니다.
예 2:

입력: s = "bbbbb"
출력: 1
설명: 반복되는 문자가 없는 가장 긴 하위 문자열은 "b"이므로 길이는 1입니다.

이 질문에 대해 제가 채택한 방법은 현재 하위 문자열을 저장하기 위해 정렬되지 않은 집합을 사용하고 새 문자가 추가될 때마다 현재 요소를 찾기 위해 정렬되지 않은 집합을 사용하고 실시간으로 현재 길이와 최대 길이를 유지하는 것입니다.

먼저 코드

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int left = 0,right = 0;//设定当前字串的左右边界
        int curlenght = 0,maxlenght = 0;//当前子串长度和最大子串长度
        unordered_set<char> set;//创建无序集来存储当前字符串
        for(;right < s.size(); right++)
        {
            while(set.find(s[right])!=set.end())//寻找到重复字符就从当前子串最左端开始移除
            {
                set.erase(s[left]);
                left++;
                curlenght--;//将左端右移并且将当前字串--
            }
            set.insert(s[right]);
            curlenght++;
            maxlenght = max(maxlenght,curlenght);//维护最大字串长度
        }
        return maxlenght;

    }
};

abcabcbb를 예로 들어 코드의 실행 프로세스를 살펴보겠습니다.

 처음에는 우리 상황이 이랬는데 오른쪽이 계속 오른쪽으로 이동하면서 캐릭터를 세트에 넣고 세트로 반복되는 캐릭터를 만날 때까지

 중복 문자를 발견하면 왼쪽 포인터를 이동하고 집합에서 가장 왼쪽 요소를 삭제합니다.

 이렇게 오른쪽은 계속해서 오른쪽으로 이동하다가 중복을 만나면 중복이 없을 때까지 집합에서 가장 왼쪽의 요소를 삭제합니다.

 새로 추가된 b는 아래 그림과 같이 문자열에 넣기 전에 두 요소를 제거해야 합니다.

 이런 식으로 전체 트리를 탐색했습니다.

추천

출처blog.csdn.net/asdasd121312dasd/article/details/127111827