Week5:文字列のバランス - 足は、エミュレート

タイトル内容
のみ「Q」、「W」、含まれている長さnはSの文字列、 「E」「R」 の文字の4種類。

N / 4の数の両方が、それは文字の4種類の文字列でバランスが取れている場合、文字列に表示されます。

Sは現在、同じ長さのサブストリングの連続期間とすることができ、それはバランスの取れた文字列になりそうという、唯一の4文字が含まれている任意の文字列を置換する、あるいはストリングの最小の長さを求めますか?

sが0を出力バランスしている場合。

入力形式の
ラインは、与えられた文字列Sを表し、

出力フォーマット
整数の回答

サンプル入力と出力
入力
QWER

出力
0

入力
QQWE

出力
1

入力
QQQW

出力
2

入力
QQQQ

出力
3


1 <= N - <= 10 5 ^;
N-複数4の、
ストリングのみ文字'Q'が含まれ、 'W'、 'E' 及びR ''。

問題解決のためのアイデア
二つのポインタ間の間隔を描き、両手を維持します。
すべてのポイント取得間隔外部すべての点について、各文字SUM1、SUM2、SUM3、sum4の発生回数。
その値は、最大の和に等しい、MAXの値を維持します。
だから私たちはお互いの手紙から取得することができ、最も頻繁にはまだいくつかのその手紙で表示されます。
ANS =(MAX-SUM1)+提供 (MAX-SUM2)+(MAX-SUM3)+(MAX-sum4)、 その後、私たちは満足することができる文字の条件を変更するために使用することができる少なくとも一つのANSを見つける必要があります。
そして、これはどこそれを見つけるためにポイントをANS?- 2つのポインタがセクションにゾーン外。
これは、わずか4または0の倍数であることができる文字のANSの数を減算した間隔の後でした。

現在の間隔の長さがアップし、保存、条件を満たすようにした場合、それは要件への究極の答えであってもよいし、その後、Lポインタが要件を満たすために小さい範囲があるかどうかを確認するために間隔の範囲を狭めるしようとしていること、前方に移動しました。
現在の間隔の長さ条件が満たされない場合、ポインタは、要件が満たす可能性があるかどうかを確認するために、範囲が増加する順方向Rに移動します。
最初の二つのポインタが位置0に配置されているので、要件を満たすために、文字列を変更せず、時間可能の初めから。

次のショーのコード:

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>

using namespace std;

int maxi[4];//Q W E R

void PlusMaxi(char a)
{
	switch (a)
	{
	case 'Q':
		maxi[0]++;
		break;
	case 'W':
		maxi[1]++;
		break;
	case 'E':
		maxi[2]++;
		break;
	case 'R':
		maxi[3]++;
		break;
	}
}

void SubMaxi(char a)
{
	switch (a)
	{
	case 'Q':
		maxi[0]--;
		break;
	case 'W':
		maxi[1]--;
		break;
	case 'E':
		maxi[2]--;
		break;
	case 'R':
		maxi[3]--;
		break;
	}
}

int Fun()
{
	int themax;
	if (maxi[0] > maxi[1]) themax = maxi[0];
	else themax = maxi[1];

	if (themax < maxi[2]) themax = maxi[2];

	if (themax < maxi[3]) themax = maxi[3];

	int ans = (themax - maxi[0]) + (themax - maxi[1]) + (themax - maxi[2]) + (themax - maxi[3]);
	return ans;
}

int main()
{
	memset(maxi, 0, sizeof maxi);

	string input;
	cin >> input;
	int length = input.length();
	for (int i = 0; i < length; i++)
	{
		PlusMaxi(input[i]);
	}

	if (maxi[0] == maxi[1] && maxi[1] == maxi[2] && maxi[2] == maxi[3])
	{
		cout << "0" << endl;
		return 0;
	}

	int theans = 0x3f3f3f3f;

	int l, r;
	l = r = 0;
	SubMaxi(input[0]);
	while (r != length)
	{
		int range = r - l + 1;
		int free = range - Fun();
		if (free >= 0 && free % 4 == 0)
		{
			theans = min(theans, range);
			if (l < r)
			{
				PlusMaxi(input[l]);
				l++;
			}
			else
			{
				PlusMaxi(input[l]);
				l++;
				if (r < length)
				{
					r++;
					SubMaxi(input[r]);
				}
			}
		}
		else
		{
			if (r < length)
			{
				r++;
				SubMaxi(input[r]);
			}
		}

	}

	cout << theans << endl;

	return 0;


}
公開された21元の記事 ウォンの賞賛3 ビュー407

おすすめ

転載: blog.csdn.net/qq_44506233/article/details/105105530