문제 설명 :
문자열을 감안할 때, 당신은 반복 문자를 포함하지 않는 찾을 가장 긴 문자열의 길이를.
예 1 :
입력 : "abcabcbb"
출력 : 3
설명 : 문자의 긴 문자열이 더 반복 없기 때문에 "abc",所以其
길이는 3입니다.
예 2 :
입력 : "BBBBB"
출력 : 1
설명 : 문자의 긴 문자열이 반복되지 않기 때문에 "b"
,이 길이는 1 있도록합니다.
예 3 :
입력 : "pwwkew" 출력 : 3 설명 : 문자의 긴 문자열이 반복되지 않기 때문에"wke"
, 그래서 3의 길이 그. 당신의 대답이 있어야합니다 있습니다 문자열 의 길이,"pwke"
A는 서브 시퀀스 가 아닌 문자열입니다.
기본적인 아이디어 :
다시 문장 해시 세트를 사용하여, 슬라이딩 윈도우를 사용하는 아이디어.
당신이 반복 요소가 발생하는 경우, 포인터의 앞에 지속적으로 반복되는 요소 스캔 다음 요소까지 앞으로 스캔합니다.
AC 코드 :
class Solution {
public:
int lengthOfLongestSubstring(string s) {
// 处理特殊情况
if (s == "") return 0;
int i = 0, j = 1; // 记录我们窗口的起末索引
unordered_set<char> hashset; // 记录窗口中的内容
hashset.insert(s[i]);
int max_len = 1;
while (j != s.size()) {
if (hashset.count(s[j])) { // 如果这个元素已经存在
while (s[i] != s[j]) {
hashset.erase(s[i]);
++i;
}
hashset.erase(s[i++]); // 把重复的元素也给删咯
} else {
hashset.insert(s[j++]);
// 注意无符号数和有符号数之间的比较。
max_len = hashset.size() > max_len? hashset.size() : max_len;
}
}
return max_len;
}
};
다른 경험 :
- 내 아들은 unordered_set 속도가 훨씬 빨리 후 나는 변경, 정말 느린 설정 옳았다. 설정 삽입 및 쿼리 작업을 느리게하기 때문이다. 우리 unordered_set 평균 시간 복잡도는 O (1)이다. 그래서 미래는 unordered_set를 사용하는 것이 좋습니다.
- 부호 및 기호의 특정 번호로 지불 관심에 더 많은 시간을 - 예를 들어, 우리는 최대 값을 찾아, 최대 값은 우리 수도 INT_MIN를 시작하도록 설정되어,이 음의 번호입니다, 그것은 자동으로 말하자면 size_type 타입의 비교를 켜집니다 양수, 가기 어렵다.