题目:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
解题思路:
1.滑动窗口方法
代码如下:
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
//s[start,end) 前面包含 后面不包含
int start(0), end(0), length(0), result(0); //length是子串长度
int sSize = int(s.size());
while (end < sSize)
{
char tmpChar = s[end]; //tmpchar是暂存end所指的字符
for (int index = start; index < end; index++)
{
if (tmpChar == s[index])
{
start = index + 1; //修改start为index位置后一位作为新的开始端
length = end - start; //重新计算子串长度,可举例验证
break; //终止for循环
}
}
end++;
length++;
result = max(result, length); //最后选择较大的输出
}
return result;
}
};
2.hashmap:时间复杂度和空间复杂度均为O(n)
代码如下:
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
//s[start,end) 前面包含 后面不包含
int start(0), end(0), length(0), result(0);
int sSize = int(s.size());
unordered_map
while (end < sSize)
{
char tmpChar = s[end];
//仅当s[start,end) 中存在s[end]时更新start
if (hash.find(tmpChar) != hash.end() && hash[tmpChar] >= start)
{
start = hash[tmpChar] + 1;
length = end - start;
}
hash[tmpChar] = end;
end++;
length++;
result = max(result, length);
}
return result;
}
};
3.数组代替hash:思想类似,时间复杂度和空间复杂度均为O(n)
代码如下:
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
//s[start,end) 前面包含 后面不包含
int start(0), end(0), length(0), result(0);
int sSize = int(s.size());
vector
while (end < sSize)
{
char tmpChar = s[end];
//仅当s[start,end) 中存在s[end]时更新start
if (vec[int(tmpChar)] >= start)
{
start = vec[int(tmpChar)] + 1;
length = end - start;
}
vec[int(tmpChar)] = end;
end++;
length++;
result = max(result, length);
}
return result;
}
};



