[每日一题2020.06.18]leetcode #3 hash_map实现滑动窗口
解 :
利用hashmap ( C++中的unordered map, map也行不过map基于红黑树速度慢点 ) 保存每一个字符第一次出现的位置, 用一个r ( 窗口右侧 ) 向后遍历, 找到第一个出现在map里的数, 更新l (窗口左侧) 为 map[s[r]] + 1, 实现窗口的滑动, 窗口没加入一个元素更新一次ans = max(ans, cnt) , 最后return ans
#include<bits/stdc++.h>
using namespace std;
int lengthOfLongestSubstring(string s) {
int ans = 0;
int cnt = 0;
unordered_map<char, int> mp;
int r = 0;
int l = 0;
while (r < s.size()) {
if (!mp.count(s[r]) || mp[s[r]] < l) {
mp[s[r]] = r;
cnt++;
}
else {
cnt = r - mp[s[r]];
l = mp[s[r]] + 1;
mp[s[r]] = r;
}
ans = max(ans, cnt);
r++;
}
return ans;
}
int main() {
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
string s;
cin >> s;
cout << lengthOfLongestSubstring(s) << endl;
return 0;
}