文字列の並べ替えHihoCoder - 1712

タイトル説明

通常時に私たちは、ソート文字列が辞書の順序に従って並べ替えられます。文字列はアルファベット順に「ABCDEFGHIJKLMNOPQRSTUVWXYZ」に対応し、小文字のみが含まれている場合。

前に「C」前の行「D」、「D」の前に「B」、「C」で「E」に代わって、bdceafghijklmnopqrstuvwxyz ......:今、私たちは、26文字の新しい配列を得るために、アルファベットをスクランブル

与えられたNの文字列は、あなたはアルファベット順に新しいソートそれらに従ってください。
エントリー

最初の行は、整数Nを含んでいます (1 <= N <= 1000)

2行目は、26個の文字を含む新しい秩序を表します。

ストリングSの次のNライン (| S | <= 100)
の出力

新しい文字列、各列ラインに応じN順次出力。
サンプル入力

5
bdceafghijklmnopqrstuvwxyz
abcde
adc
cda
cad
ddc

サンプル出力

ddc
cda
cad
abcde
adc

思考

質問の意味は、文字列のソート、指定された新しい辞書の順序に従って、おそらくあります。ここで私は26の英語の文字がNewOrderを表す与えられましたこの特定の文字列がソートのために、我々はおなじみに変換し、変換する必要があります。この問題のために、C ++が容器マップを提供するために利用することができる、メモリ・マップは、次に、構造をソート列に操作された開口部、辞書式被験者によって与えられます。私はこの質問を見たとき私たちはその後、マップや瞬間まで考えた、無ソリューションに精通していない場合はまだ?もちろん、私の心の最初の反応はどのように文字列の行、一つ一つ、それを比較すると、ありませんでしたか?そうしてくださいしないでください、実際には、我々はに対応する変換された文字列の並べ替え、与えることができnewordeで添字rを。例えば:でD DDC neworder添字が1、cはneworder添字2は、同様に、他の文字列がそうすることができる、112のDDC事実に変換されます。変換が完了した後、我々は直接ソート方法、変換された文字列の配列を(各文字が記憶されて呼び出すことができneworderそれをソートする文字列配列対応する添字の組成物)。一例としてのケースをテストする:
ABCDE、ADC、CDA、CAD、後 DDCが40213,412,214,241,112に変換し
、その変換後の結果でソートUS:112,214,241,40213,412。最後に、我々その後、各文字列neworderのソートの効果を達成するために、出力要素に対応するインデックス、。例えば:NewOrder [1] = D、NewOrder [2] = Cは、その後、112の出力DDC(前列転送処理が相互にマークされています)。
注意:ピット!!!プロセス上で、次の標準の文字の文字列と、その後、注意しなければならない、直接文字列に変換されたインデックスを追加することはできません、それは以下のような出力誤った結果、以下となります。Lneworder私たちは、ソートにそれぞれ二つの「1」に「11」と、最初の「241」かどう添字11は、文字列が「11」であるに変換し、CADは、「241」に変換しましたそして、比較する第二は、間違ったソート結果を描画します。CAD> Lの文字列が元に変換戻ったとき、エラーが発生し、「11」は2つのDDではなく、私たちの以前に変換され、L移行後の添字のすべてが、このような状況を避けるために、我々はインデックスに添字によって得られた変換以外の変換が必要な場合は「0」+下付き文字にし、その後、変換された文字を追加文字列にして、ソート、ソート最後に、逆の操作は、正しい結果を返すことができた結果。それを言って、コードで、よりリアルな外観と推定されます。
C ++コード

#include<iostream>
#include<algorithm>
using namespace std;
//返回该字符在neworder中的下标 
//借鉴了快排中的双指针扫描法 
int indexof(char c,string neworder){
	int left=0;
	int right=neworder.length()-1;
	while(left<right){
		//左右同时遍历 
		if(c==neworder[left]){
			return left;
		}
		if(c==neworder[right]){
			return right;
		}
		left++;
		right--;
	}
}

int main(){
	int N; 
	string neworder;//给定的26个英文字符(指定的字典序) 
	cin>>N;
	cin>>neworder;
	string *str=new string[N];//动态分配内存,存储待排序的字符串 
	for(int i=0;i<N;i++){
		cin>>str[i];
	}
	
	//这里是将待排序的字符串,转换成对应于neworder中的下标 
	for(int i=0;i<N;i++){
		string s="";//用来存储转换后的字符串 
		for(int j=0;j<str[i].length();j++){
			int index=indexof(str[i][j],neworder);//将字符转换为新顺序的下标 
			char c='0'+index;//转换为对应的字符 
			s=s+c;//将转换后的字符添加在字符串s中 
		}
		str[i]=s; //用转换后的字符串将转换前的覆盖掉(可以不用额外开辟空间) 
	}
	//调用sort方法,对str进行排序 
	sort(str,str+N);
	//输出结果,遍历str字符串数组 
	for(int i=0;i<N;i++){
		for(int j=0;j<str[i].length();j++){
			cout<<neworder[str[i][j]-'0'];//与前面转下标的过程是互逆的 
		}
		cout<<endl;
	}
	delete []str;//释放内存空间 
	return 0;
}

スクリーンショット結果

リリース元の2件の記事 ウォンの賞賛0 ビュー10

おすすめ

転載: blog.csdn.net/weixin_43862144/article/details/105123535