很久没有写算法题解了,一个原因是前段时间因为其他事“放弃”了算法半年,然后最近这一个星期慢慢捡起来大多数题解也都有人写了博客了所以感觉也没必要写,这次写这篇题解是一个要考研上机复试的同学问我的一个问题,然后我上网搜时似乎也没看到啥满意的C++代码,就顺手写了这篇题解报告
题目连接:https://acm.ecnu.edu.cn/problem/2896/
Time limit per test: 2.0 seconds
Memory limit: 256 megabytes
给定一组以一个空格分隔的只含大小写字母的字符串。与普通字典序不同,按照给定的字母顺序对这组字符串排序。设两个字符串的字母不会完全相同。如:Hat、hat、HAt 等不会同时出现。
例如:字母顺序为 QWERTYUIOPASDFGHJKLZXCVBNM 时,一组字符串 hat cat bat book bookworm Dallas Austin Houston fire firefox fumble 的排序结果为:Austin Dallas fumble fire firefox Houston hat cat book bookworm bat。
Input
每组数据由 2 行组成,第 1 行为字母顺序(26 个大写字母),第 2 行是需要排序的一组字符串(只含大小写字母,长度不大于 20)。
数据不多于 100 组。需要排序的一组字符串中包含的字符串个数至少 1 个,至多 100 个。
Output
对于每一组数据,输出排序后的字符串。字符串之间输出一个空格,最后一个字符串后面没有空格,而是输出一个换行符。
Examples
QWERTYUIOPASDFGHJKLZXCVBNM hat cat bat book bookworm Dallas Austin Houston fire firefox fumble QWERTYUIOPASDFGHJKLZXCVBNM How are you QAZWSXEDCRFVTGBYHNUJMIKOLP How are you ABCDEFGHIJKLMNOPQRSTUVWXYZ How are you
Austin Dallas fumble fire firefox Houston hat cat book bookworm bat you are How are you How are How you
思路也很简单,考点应该就是想考一个自定义排序函数而已,只用把给出的字母优先级用到自定义排序函数中就好了
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cctype>
using namespace std;
int score[26]={0};//储存每个字母优先级的数组
bool cmp(const string &a,const string &b)//自定义排序函数
{
int len=min(a.size(),b.size());
for(int i=0;i<len;i++)
{
char tmpa=toupper(a[i]),tmpb=toupper(b[i]);
if(tmpa!=tmpb)//如果字母有不一样的,返回比较结果,达到排序效果
{
return score[tmpa-'A']<score[tmpb-'A'];
}
}
return a.size()<b.size();//如果a是b的子串,则a在b前面
}
int main()
{
string order;
while(cin>>order)
{
for(int i=0;i<26;i++)//把每个字母的优先级储存进去
{
score[order[i]-'A']=i;
}
cin.get();
string str;
getline(cin,str);
vector<string> v;
int former=0;
for(int i=0;i<=str.size();i++)//字符串分割
{
if(i==str.size()||str[i]==' ')
{
string tmp(str,former,i-former);
v.push_back(tmp);
former=i+1;
}
}
sort(v.begin(),v.end(),cmp);//排序后输出
cout<<v[0];
for(int i=1;i<v.size();i++)
{
cout<<" "<<v[i];
}
cout<<"\n";
}
return 0;
}