class Solution {
public:
int lengthOfLongestSubstring(string s) {
/*滑动窗口方法*/
/*
原理:
指针start,end分别指向子串的首尾,end不断向末尾扩展
tmChar记录当前子串end新移动到的位置的值
若在start~end-1中找到了等同于tmChar时说明出现了重复元素
这时start调整到tmpChar的下一个元素
比较新子串与老子串的长度
*/
int start = 0, end = 0, length = 0, result = 0;
int sSize = int(s.size());
while(end < sSize){
char tmpChar = s[end];
for(int index = start; index < end; index++){
if(tmpChar == s[index]){
start = index + 1;
length = end - start;
break;
}
}
end ++;
length ++;
result = max(result, length);
}
return result;
}
};
/*
int lengthOfLongestSubString(String s){
int start = 0, end = 0, length = 0, result = 0;
int sSize = s.size();
unordered_map<char, int> hash;//创建哈希表
//思路,start~end之间一定没有重复元素,end向右移动过程中将元素添加入哈希表,每移动一个元素判断哈希表中是否存在该元素,若存在说明当前end位置是重复元素,则start调整到该元素的下一个位置,end调整到该位置,重复,若在哈希表中没有出现,则证明成立,子串长度加一
while(start < end){
char tmpChar = s[end];//当前子串末尾元素
if(hash.find(tmpChar) != hash.end() && hash.find(tmpChar) > start)//假如在当前子串的右侧出现了新的tmpChar元素{
start = hash[tmpChar] + 1;//新子串的起始位置调整
length = end - start;//当前子串的长度
}
hash[tmpChar] = end;
length ++;
result = max(result, length);
}
return result;
}
*/
/*
int lengthOfLongestSubstring(string s)
{
//s[start,end) 前面包含 后面不包含
int start(0), end(0), length(0), result(0);
int sSize = int(s.size());
vector<int> vec(128, -1);//定义一个128位初始化为-1的容器
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;
}
*/
求无重复字符串的最大子串(滑动窗口,哈希优化,桶优化)力扣第三题
猜你喜欢
转载自blog.csdn.net/qq_41582910/article/details/105061453
今日推荐
周排行