一、问题描述
Description: Given a string, find the length of the longest substring without repeating characters.
For example: For
"abcabcbb"
, the longest substring without repeating letters is"abc"
, which the length is 3.For
"bbbbb"
, the longest substring is"b"
, with the length of 1.
给定一个字符串,找出不包含重复字符的最长的子串,返回该子串的长度。
二、解题报告
思路:维护一个buffer
缓冲区,用于存放当前的子串(不包含重复字符)。遍历字符串,对于每一个字符:
- 若 buffer 中没有重复的字符,则把该字符加入缓冲区;
- 若 buffer 中存在该字符(假设位于pos),则说明重复了。记录缓冲区的长度,同时更新最长的子串长度。
- 删除 buffer 的 0~pos 这一段,然后继续迭代。
关键就在于当发现重复的字符时,需要删除缓冲区的前面一部分。
下面直接上代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int maxlen = 0;
string buffer;
for(int i=0; i<s.size(); ++i)
{
int pos = buffer.find(s[i]);
if(pos >= 0) // 重复
{
// 更新最长长度
maxlen = maxlen > buffer.size()? maxlen : buffer.size();
// 删除从0到pos的所有字符
buffer.erase(buffer.begin(), buffer.begin()+pos+1);
}
buffer += s[i];
}
return maxlen > buffer.size() ? maxlen : buffer.size();
}
};
LeetCode答案源代码:https://github.com/SongLee24/LeetCode