[每日一题2020.06.18]leetcode #3 hash_map实现滑动窗口

1592377167260

解 :

利用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;
}
posted @ 2020-06-17 15:03  roccoshi  阅读(80)  评论(0编辑  收藏  举报