正经题解| 追击123
2024-04-01 16:41:02
发布于:浙江
24阅读
0回复
0点赞
题目大意
给你一个字符串 长度为 ,字符串中只包含 ,,。
题意分析
找到一个最短的区间,区间内要同时出现,,,。
解题思路
对于不能改变顺序的字符串,要想到如何遍历区间,减少遍历次数。
我们设区间为 ,始终保证区间是最短区间,我们可以用双指针来做。
- 初始化 ,一开始没有选择任何区间
- 拓展区间 ,记录当前区间内 ,,,出现的次数。
- 在区间满足的时候,不断缩减区间 ,同时更新,,,出现的次数。
时间复杂度分析
区间中 最多拓展到 , 最多缩减到 ,复杂度为:。
代码演示
#include <bits/stdc++.h>
using namespace std;
int t;
bool check(unordered_map<char,int> &mp) {
return mp['1'] > 0 && mp['2'] > 0 && mp['3'] > 0;
}
int main() {
string s;
cin >> t;
while(t--) {
unordered_map<char,int> mp;
cin >> s;
int l = 0,r = 0,len = s.length();
int ans = 0;
while(r < len) {
mp[s[r]]++;
if (check(mp) && ans == 0)ans = r - l + 1;
while(check(mp) && l <= r) {
ans = min(ans,r - l + 1);
mp[s[l]]--;
l++;
}
r++;
}
cout << ans << endl;
}
return 0;
}
这里空空如也
有帮助,赞一个