week5ジョブC

問題の意味:
のみ「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 ''。
アイデア:
入力文字列の各文字の数を決定するには。決意した後、0に被験者の要件に行あたりの文字数がそれ以外の場合は、出力がn文字-n操作よりも大きくなる場合。それが0動作前に記憶された文字の数と比較される各文字の数は、左右の境界によって操作の値の後に再び決定されるように、条件が満たされ、左マージンが減少する格納された残りの文字、文字を満たすため、文字の数が1減少し、常に境界裁判官の周りに移動し、国境を高めるために、右、右ボーダーの出会い文字、文字の数プラス1を満たしていない、答えを更新し、出力。

コード:

#include<iostream>
#include<cstring>
#include<map>
using namespace std;
char temp[4]={'Q','W','E','R'};
map<char,int> ran;
int main()
{
	string s;
	cin>>s;
	//int length=s.length();
	for(int i=0;i<s.length();i++)
	{
		if(s[i]=='Q')
		{
			ran[temp[0]]++;
		}
		if(s[i]=='W')
		{
			ran[temp[1]]++;
		}
		if(s[i]=='E')
		{
			ran[temp[2]]++;
		}
		if(s[i]=='R')
		{
			ran[temp[3]]++;
		}
	}
	int n=s.length()/4;
	if(ran[temp[0]]==n&&ran[temp[1]]==n&&ran[temp[2]]==n&&ran[temp[3]]==n)
	{
		cout<<"0";
		return 0;
	}
	int num=0;
	for(int i=0;i<4;i++)
	{
		if(ran[temp[i]]>n)
		{
			ran[temp[i]]=ran[temp[i]]-n;
			num=num+ran[temp[i]];
		}
		else
		{
			ran[temp[i]]=0;
		}
	}
	int left=0,right=0;
	int cm[4]={0};
	int ans=s.length();
	for(int i=left;i<=right;i++)
	{
		if(s[i]=='Q')
		{
			cm[0]++;
		}
		if(s[i]=='W')
		{
			cm[1]++;
		}
		if(s[i]=='E')
		{
			cm[2]++;
		}
		if(s[i]=='R')
		{
			cm[3]++;
		}
		
	}
	while(right<s.length())
	{
		if(cm[0]>=ran[temp[0]]&&cm[1]>=ran[temp[1]]&&cm[2]>=ran[temp[2]]&&cm[3]>=ran[temp[3]])
		{
			if((right-left)<ans)
			   ans=right-left+1;
			if(s[left]=='Q')
			   cm[0]--;
			if(s[left]=='W')
			   cm[1]--;
			if(s[left]=='E')
			   cm[2]--;
			if(s[left]=='R')
			   cm[3]--;
			left++;
		}
		else
		{
			right++;
			if(s[right]=='Q'&&right!=s.length())
			   cm[0]++;
			if(s[right]=='W'&&right!=s.length())
			   cm[1]++;
			if(s[right]=='E'&&right!=s.length())
			   cm[2]++;
			if(s[right]=='R'&&right!=s.length())
			   cm[3]++;
		}
	}
	cout<<ans;
	return 0;
 } 
公開された19元の記事 ウォンの賞賛0 ビュー206

おすすめ

転載: blog.csdn.net/weixin_45117273/article/details/105331776