cspm2——T2HRZ英語を学ぶ

トピック

制限時間

1秒

スペースの制約

64MB

タイトル説明

ルイセンは今年3年生です。冬休みに26文字の英語を学んだので、とてもワクワクしています!

それで彼は友人のTTに彼をテストするように頼みました、そしてTTは薫からの良い質問を考えました:文字列を与えられて、26の連続した大文字を探してそれを出力してください!

しかし、それを考えた後、これはRuishenには安すぎるので、彼は難易度を上げました。文字列が与えられると、文字列には26個の大文字と特殊文字「?」、特殊文字「?」が含まれます。'任意の大文字を表すことができます。

TTは、26個の大文字で構成される連続したサブストリングがあるかどうかを尋ねます。このサブストリングには、各文字が1回だけ表示されます。存在する場合は、左から最初の出現を出力してください。要件を満たすサブストリングであり、同時に左端の位置を満たすソリューションのセットが複数ある場合は、字句次数が最小のソリューションが出力されます。存在しない場合は-1を出力してください!

HRZは窮地に陥りました。彼は26通の手紙を学んだばかりですが、それは彼には難しすぎるので、助けを求めに来ます。彼がこの問題を解決するのを手伝ってください。報酬はあなたがオーバーウォッチをプレイするのを手伝うことです。

注:字句の順序は、最初の文字に従ってA、B、C ... Zの順序で最初になります。最初の文字が同じである場合は、2番目、3番目、さらには後続の文字を比較します。最後の2つの単語(たとえば、SIGHとSIGHT)と同じ長さでない場合は、短い方が最初にランク付けされます。例えば

AB??EFGHIJKLMNOPQRSTUVWXYZ

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABDCEFGHIJKLMNOPQRSTUVWXYZ

上記の2つの入力方法はどちらも26文字を形成できますが、必要な語彙の順序は最小であり、前者のみを使用できます。

タイトルには、最初に表示される、最小の字句順序が必要であることに注意してください。

入力フォーマット

入力は1行だけで、タイトルの説明と一致する文字列です。

出力フォーマット

出力は1行のみです。そのようなサブストリングがある場合は出力してください。そうでない場合は-1を出力してください。

サンプル入力1

ABC ?? FGHIJK ??? OPQR?TUVWXY?

サンプル出力1

ABCDEFGHIJKLMNOPQRSTUVWXYZ

サンプル入力2

AABCDEFGHIJKLMNOPQRSTUVW ?? M

サンプル出力2

-1
ここに写真の説明を挿入

アイデア

1.この質問は、ウィンドウをスライドさせるという考えを使用しています。
1.配列intabc [27]は、スライディングウィンドウに文字A〜Zがあるかどうかを格納するために使用され、添え字0〜25に対応します。3。
ウィンドウサイズが26未満の場合、ウィンドウの右ポインタを1スペース右に移動し、abcを使用します。配列は、新しく移動した文字がウィンドウ内で繰り返されるかどうかを判断します。繰り返しがある場合、左ポインターは繰り返される文字の次の文字に移動し、移動中にトラバースされた文字に対応するabcが-1に設定されます。
4.遭遇したとき?右ポインタ
5の右側を処理せずに、ウィンドウサイズ==ループ26の外にある場合、コンテンツはl〜rを出力し、?の場合、abc配列をトラバースし、値が-1の最初の文字に割り当てます
。rを文字列の右端に移動すると、ループが終了します。このとき、ウィンドウ長が26未満の場合は-1を出力し、そうでない場合はl〜rの文字列を出力します。

エラー

1.配列のサイズは26ですが、後で検索すると-1がなくなるため、配列が範囲外になるという問題が発生します。
2. Stringとstring.hは、完全に異なる2つのヘッダーファイルです。String.hには、Cコードに属するchar *処理用の関数がいくつか含まれていますが、stringには、文字列データタイプを処理するための関数が含まれています。文字列タイプを使用する場合は、必ずヘッダーファイル<string>を含めてください。

コード

#include<iostream>
#include<string.h>
#include<string>
using namespace std;
const int maxn=1e6+10;
string a;
int abc[27];
int main()
{
    
    
	cin>>a;
	int len=a.length(),count=0;
	memset(abc,-1,sizeof(abc));
//	cout<<len<<endl;	
	int l=0,r=0;
	while(r<len&&count<26)
	{
    
    
		if(a[r]=='?')
		{
    
    
			r++;
			count++;			
		}
		else
		{
    
    
		int num=a[r]-'A';
		if(abc[num]==-1)
		{
    
    
			abc[a[r]-'A']=r;
			r++;
			count++;		
		}
		else
		{
    
    

			while(a[l]!=a[r])
			{
    
    
			int num2=a[l]-'A';	
			abc[num2]=-1;
			count--;
			l++;			
			}
			abc[num]=r;
			l++;
			r++;
		}			
		}

	}
	if(count!=26)
		cout<<-1<<endl;
	else
	{
    
    
		int i=0;
		while(abc[i]!=-1)
			i++;
		for(l;l<r;l++)
		{
    
    
			if(a[l]=='?')
			{
    
    
				char cha='A'+i;
				cout<<cha;
				i++;
				while(abc[i]!=-1)
					i++;
			}
			else
				cout<<a[l];
		}
		cout<<endl;
	}

	return 0;
}

おすすめ

転載: blog.csdn.net/alicemh/article/details/105388827