题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
class solution
{
public:
//暴力法,时间复杂度为O(n2)
int lengthOfLongestSubstring(string s) {
//定义两个游标,还有长度,与结果,均初始化为0
int start(0),end(0),length(0),result(0);
//只要end<字符串大小
while(end<s.size())
{
//该注释错误 //暂存首个字符char,
//其实应该是暂存end所指向的那个值,到时候会跟index所指向的值比较
char tempChar=s[end];
//定义index,它只用于改变start的指向一般为index+1
//因为index所处的与end的值相等,则没有统计的必要了
//for循环只用来判断是否相等
//
for(int index=start;index<end;index++)
{
//判断是否出现重复字符串
if(tempChar==s[index])
{
//start++;//这是错误的哦,没有优化呢
//如果出现,则将start跳过重复字符index指向的下一字符
start=index+1;
//保存长度
length=end-start;
/
//千万注意,如果相等,则该判断应该结束了
break;
}
}
//此时,end向后移动,每一一次,长度+1
end++;
length++;
//返回更新后的length,如果更大,则为它
result=max(result,length);
}
return result;
}
class solution
{
public:
//使用哈希表
int lengthOfLongestSubstring(string s) {
//初始化start,end两个指针,以及length,result两个结果,均初始化为0
int start(0), end(0), length(0), result(0);
//创建哈希表,此时没有任何一个元素
map<char, int> hash;
//end指针向右移动,边界,小于字符串长度
//记住,在最后的循环中,end会跳到最后一个字符的右边位置,也就是哨兵位置
while (end < s.size())
{
//暂存end所指向的那个字符,到时候会跟哈希表比较
char tempChar = s[end];
//现在可以在hash中寻找tempChar了,当然第一次肯定失败的
//第二个条件能不能理解为防止当前start进行无效操作呢因为start必须在tempChar左边,才能跳转到tempChar右边,那么是不是实际根本不会出现start在tempChar的右边呢(因为下一次循环tempChar的位置会变呀)
//仅当哈希表中存在s[end],才更新start的位置
if (hash.find(tempChar) != hash.end() && hash[tempChar] >= start)
{
//找到了,则start指针跳转至相同的下一个字符位置
start = hash[tempChar] + 1;
//更新长度
length = end - start;
}
//如果哈希表没有找到,则添加相关对组
hash[tempChar] = end;
//end指针右移一位,同时长度+1
//在最后一次循环,end实际是跳到了最后一个字符的右边(即`\0`的位置哦)
end++;
length++;
//取两者最大者
result = max(length, result);
}
//返回结果
return result;
}
};