一般我们在对字符串排序时,都会按照字典序排序。当字符串只包含小写字母时,相当于按字母表"abcdefghijklmnopqrstuvwxyz"的顺序排序。
现在我们打乱字母表的顺序,得到一个26个字母的新顺序。例如"bdceafghijklmnopqrstuvwxyz"代表’b’排在’d’前,'d’在’c’前,'c’在’e’前……
给定N个字符串,请你按照新的字母顺序对它们排序。\
Input
第一行包含一个整数N。(1 <= N <= 1000)
第二行包含26个字母,代表新的顺序。
以下N行每行一个字符串S。 (|S| <= 100)
Output
按新的顺序输出N个字符串,每个字符串一行。
Sample Input
5
bdceafghijklmnopqrstuvwxyz
abcde
adc
cda
cad
ddc
这道题的难点在于将固定的顺序打破,并让下文按你所想的顺序进行排序,这里用结构体
思路:
"一般我们在对字符串排序时,都会按照字典序排序。当字符串只包含小写字母时,相当于按字母 表"abcdefghijklmnopqrstuvwxyz"的顺序排序。现在我们打乱字母表的顺序,得到一个26个字母的新顺序。例 如"bdceafghijklmnopqrstuvwxyz"代表’b’排在’d’前,'d’在’c’前,'c’在’e’前…… "
将给出的26个小写字母依此当成a~z即可,进行排序即可,因为要输出字符串,所以需要记下未转化前的字符串 给定一个结构体:里面有两个元素s1 s2都为char数组,s1为输入字符串,s2为转化后的字符串,然后结构体排序即 可。
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct zifu
{
char ru[150],chu[150];
};
bool cmp(zifu n,zifu m)
{
return (strcmp(n.chu,m.chu)<0);
}
int main()
{
int t,b;
char shun[30],xu[30];
zifu n[1100];
scanf("%d%s",&t,shun);
for(int i=0; i<26; i++)
{
xu[shun[i]-'a']=i+'a'; //将你所希望的顺序的字母转化成数字下标,可利用此方法将第i个字母对应到新的字母;下面也可以用这个方法将ru中的字母变为下标,得到chu
}
for(int i=0; i<t; i++)
{
scanf("%s",n[i].ru);
b=strlen(n[i].ru);
for(int j=0; j<b; j++)
{
n[i].chu[j]=xu[n[i].ru[j]-'a']; //将上面定义的xu的值赋给chu,下标为ru[j]-'a';此时的chu[j]的值对应的是转化后的值,即'b'对应为'a','a'对应为'b',再进行排序;
n[i].chu[b]='\0'; //记住,我们再给字符串单独赋值时,要加上结束标识'\0'
}
}
sort(n,n+t,cmp);
for(int i=0; i<t; i++)
{
printf("%s\n",n[i].ru);
}
}