2020牛客寒假算法基础集训营1 G-H(双指针)

G-eli和字符串

eli拿到了一个仅由小写字母组成的字符串。
她想截取一段连续子串,这个子串包含至少 k个相同的某个字母。
她想知道,子串的长度最小值是多少?

用数组记录每个字母出现的位置,用双指针指向,更新长度。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

vector<int> S[26];

int main(void)
{
	int n, k;
	string ss;
	cin >> n >> k >> ss;
	for (int i = 0; i < ss.size(); i++) S[ss[i] - 'a'].push_back(i);
	int ans = 0x3f3f3f;
	int flag = 0;
	for (int i = 0; i < 26; i++) {
		if (S[i].size() >= k) {
			flag = 1;
			for (int j = 0; j + k <= S[i].size(); j++) {
				ans = min(ans, S[i][j + k - 1] - S[i][j] + 1);
			}
		}
	}
	if (!flag) cout << "-1";
	else cout << ans;
	return 0;
}

H-nozomi和字符串
题目描述
nozomi看到eli在字符串的“花园”里迷路了,决定也去研究字符串问题。
她想到了这样一个问题:
对于一个“01”串而言,每次操作可以把0字符改为1或把1改为0。
nozomi有最多k次操作的机会。她想在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。
nozomi想问问聪明的你,这个子串的长度最大值是多少?

跟G做法差不多,记录01的位置,双指针指向。
注意计算长度的时候要用后指针后一个的位置减前指针前一个的位置。
为防止计算的时候j+1溢出,在数组最后添加n

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

int main(void)
{
	vector<int> p0, p1;
	string s;
	int n, k;
	cin >> n >> k;
	cin >> s;
	for (int i = 0; i < n; i++) {
		if (s[i] == '0') p0.push_back(i);
		else p1.push_back(i);
	}
	p0.push_back(n);//防溢出
	p1.push_back(n);
	int ans = 0;
	if (p0.size() - 1 <= k || p1.size() - 1 <= k) {
		cout << n;
		return 0;
	}
	for (int i = 1, j = k; j < p0.size() - 1; i++, j++) {
		ans = max(ans, p0[j + 1] - p0[i - 1] - 1);//后指针后一个的位置减前指针前一个的位置
	}
	for (int i = 1, j = k; j < p1.size() - 1; i++, j++) {
		ans = max(ans, p1[j + 1] - p1[i - 1] - 1);
	}
	cout << ans;
	return 0;
}
发布了16 篇原创文章 · 获赞 9 · 访问量 4572

猜你喜欢

转载自blog.csdn.net/qq_43054573/article/details/104184296