문자열 정렬 HihoCoder - 1712

제목 설명

일반적으로 우리는 정렬 문자열 정렬 사전 순서에 따라 때. 문자열은 알파벳 순서로 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"에 해당하는 소문자를 포함합니다.

전에 'C'앞에 행 'D', 'D'이전 'B', 'C'에서 'E'를 대신하여, bdceafghijklmnopqrstuvwxyz ... : 이제 우리는 26 글자의 새로운 시퀀스를 얻기 위해, 알파벳 스크램블

을 감안할 때 N 문자열, 당신은 알파벳순으로 새로운 종류의를 따르십시오.
기입

첫 번째 행은 정수 N. 포함 (1 <= N <= 1000)

두 번째 줄, 26 문자가 포함 된 새 순서를 나타냅니다.

S. 문자열의 다음 N 라인 (| S | <= 100)
출력

새로운 캐릭터 각 캐릭터 라인 N에 따라 순차적으로 출력.
샘플 입력

5
bdceafghijklmnopqrstuvwxyz
abcde
adc
cda
cad
ddc

샘플 출력

ddc
cda
cad
abcde
adc

사고

질문의 의미하는 문자열을 정렬 지정된 새 사전 순서에 따라, 아마. 여기에 26 개 영어 문자 NewOrder로 표시 주어졌다 . 이 특정 문자열이 정렬을 위해, 우리는 익숙한로 변환, 변환해야합니다. 이 질문에 대한, C ++은 용기 맵을 제공하는데 이용 될 수 있고, 상기 메모리 맵은 다음 구조를 정렬 문자열 조작 개방 될 사전 식으로 주어진다. 우리는지도 또는 순간에 익숙하지 않은 그래서 경우까지 생각 다음 해결책 아직? 물론 아니지, 나는이 질문을보고, 내 마음이 먼저 반응했다, 어떻게 비교 문자열 행, 하나 하나,? 그렇게 확신하지 마십시오, 사실, 우리는에 해당하는 변환 문자열의 종류, 제공 할 수 neworde 에서 첨자 R을. 예를 들어 DDC에서 D neworder 첨자 1에서 C이다 neworder 후, 동일한 방식으로, 112 DDC 사실로 변환 첨자 2, 다른 스트링 그렇게 할 수있다. 변환이 완료된 후, 직접 정렬 방법에있어서, 상기 변환 된 문자열의 배열 (각 캐릭터가 저장된 호출 할 neworder 을 정렬을 문자열 배열 대응 첨자 조성물). 예를 들어 같은 경우를 테스트하려면 :
ABCDE, ADC, CDA, CAD, 후 DDC는 40213,412,214,241,112로 변환
, 결과는 변환 후 결과입니다 종류의 우리 : 112,214,241,40213,412. 마지막으로, 각 문자 스트링으로 neworder의 인덱스, 출력 요소에 대응하는 종류의 효과를 얻을 수있다. 예를 들어 [. 1] D = NewOrder, NewOrder [2] = C 후, DDC (112 개)에 출력 (전송 이전 문자열 처리를 역수로 표시된다).
참고 :구덩이! 과정을 위 하고 다음 표준에 문자의 문자열, 주목해야한다, 직접 문자열로 변환 된 인덱스를 추가 할 수 없습니다, 그것은 것 같은 출력 잘못된 결과 : Lneworder 첨자 (11), 문자열로 변환 CAD가 각각 두 개의 "1"로하면 우리 일종의 것 "11", "241"로 변환에서 "241"첫 번째, "11"입니다 와 비교하는 두 번째, 잘못된 정렬 결과를 그릴 것, CAD가> L이 문자열은 원래로 변환 다시 일 때, 그리고 오류가 발생, "11"이 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;
}

스크린 샷 결과

출시 두 원저 · 원의 칭찬 0 · 조회수 10

추천

출처blog.csdn.net/weixin_43862144/article/details/105123535