题目描述
知识点
哈希表、双指针、滑动窗口
我的实现
码前思考
首先想到的还是使用动态规划来解题,没有想到滑动窗口,惭愧。
代码实现
//使用滑动窗口进行解题
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int size = s.size();
//进行特判
if(size == 0){
return 0;
}
int len = 1;
int left = 0;
int right = 0;
unordered_map<char,int> window;
while(right < s.size()){
char c = s[right];
right++;
//如果包含了这个字符,那么需要左移
if(window[c] == 1){
while(s[left] != c){
window[s[left]] = 0;
left++;
}
left++;
}else{
window[c] = 1;
}
if(right - left > len){
len = right - left;
}
}
return len;
}
};
码后反思
无
二刷代码
动态规划版本:
//采用动态规划进行解题
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int maxval = 0;
int pre = maxval;
for(int i=0;i<s.size();i++){
int len = 1;
int j;
for(j=1;j<=pre;j++){
if(s[i-j]==s[i]){
break;
}else{
len++;
}
}
pre = len;
maxval = max(maxval,len);
}
return maxval;
}
};
自己写的滑动窗口代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.size();
int res = INT_MIN;
unordered_map<char,int> window;
if(len==0){
return 0;
}
//开始使用滑动窗口机制进行解题
int left = 0;
int right = 0;
while(right!=s.size()){
char c = s[right];
int len;
if(window[c]!=0){
//说明已经有了,那么需要进行特判
while(s[left]!=c){
window[s[left]]=0;
left++;
}
left++;
}else{
window[c]++;
}
//计算长度
len = right-left+1;
if(len>res){
res=len;
}
right++;
}
return res;
}
};