3. 无重复字符的最长子串
2021-04-23 本文已影响0人
乘瓠散人
题目:给定一个字符串,找出其中不含重复字符的最长子串的长度。比如'abba'的最长子串长度为2。
思路:假设我们选择字符串中第k个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为r,那么当选择第k+1个字符为起始位置时,首先从k+1到r之间的字符显然是不重复的,并且由于少了原本的第k个字符,可以尝试增大r,直到出现了重复字符为止。
因此用滑动窗口实现,使用两个指针表示字符串中某个子串(窗口)的左右边界。在每一步操作中,将左指针右移一格,表示开始枚举下一个字符作为起始位置,然后不断右移右指针,直到出现了重复字符,记录下当前(窗口)子串的长度。最后返回最长的子串长度。
int lengthOfLongestSubstring(string s) {
unordered_set<char> st;
int res = 0;
int right = 0;
for (int i=0; i<s.length(); i++) {
while (right < s.length() && st.count(s[right])==0) {
st.insert(s[right]);
right++;
}
int cnt = right - i;
if (cnt > res) res = cnt;
st.erase(s[i]);
}
return res;
}