【暴力】B

B - Ternary String

题意:给定一段只包含“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;
}
原文地址:https://www.cnblogs.com/streamazure/p/12908051.html