题意:给定一段只包含“1”“2”“3”的字符串,求其中包含三个数字的连续子串的最小长度。
思路:不断更新各数字的最近一次出现的位置,再用其中最大下标与最小下标计算这个合法子串的长度,再不断更新答案即可。
就,注意这种求最优解的题,有时候只需要在遍历过程中不断更新答案就可以得最优解了,不需要DP什么的
int vis[5];
string s;
int ss[maxn];
void solve() {
mem(vis, 0);
s.clear();
int ans = INF;
cin >> s;
int n = s.length();
s = ' ' + s;
f(i, 1, n) ss[i] = s[i] - '0';
f(i, 1, n) {
if (vis[1] && vis[2] && vis[3]) {
int begin = min(vis[1], min(vis[2], vis[3]));
int last = max(vis[1], max(vis[2], vis[3]));
ans = min(ans, last - begin + 1);
}
vis[ss[i]] = i;
}
if (ans != INF) cout << ans << endl;
else cout << 0 << endl;
}