题目链接:P1628 合并序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
有 N 个单词和字符串 T,按字典序输出以字符串 T 为前缀的所有单词。
输入格式
输入文件第一行包含一个正整数 N;
接下来 N 行,每行一个单词,长度不超过 100;
最后一行包含字符串 T。
输出格式
按字典序升序输出答案。
输入输出样例
输入 #1
6
na
no
ki
ki
ka
ku
k
输出 #1
ka
ki
ki
ku
说明/提示
【数据规模】
对于 60% 的数据,满足 1 ≤ N ≤ 1000;
对于 100% 的数据,满足 1 ≤ N ≤ 100000 且所有字符均为小写字母。
解题代码 1(2021-10-12)
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
string tmp,T;
int N,i,j,z,min_,c,d,e;
cin>>N;
string *s=new string [N]; // 开辟一个能放N个string类型大小的存储空间
for(i=0;i<N;i++)
{
cin>>s[i]; // 输入N行字符串
}
/* 选择排序法
for(i=0;i<N-1;i++)
{
min_=i;
for(j=i+1;j<N;j++)
{
if(s[j]<s[min_])
min_=j;
}
if(min_!=i)
{
tmp=s[min_];
s[min_]=s[i];
s[i]=tmp;
}
}
*/
sort(s,s+N); // 这里直接使用 sort()函数替换选择排序法对字符串进行升序排序,方便快捷!
cin>>T;
c=T.length(); // 字符串T所含字母个数
for(z=0;z<N;z++)
{
e=0; // 每次循环e重新计数
for(d=0;d<c;d++)
if(T[d]==s[z][d]) // 从第z行字符串的第0个字符依次进行比较,若字符相同,则e+1。
e++;
if(e==c) // 前c个字符依次与T对应的字符进行比较结果均相同
cout<<s[z]<<endl; // 若该行字符串的前c个字符组成的字符串与T相同,则输出该字符串。
}
delete []s; // 释放该存储空间
return 0;
}
解题代码 2(2022-10-06)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
vector<string> a(n);
for(int i = 0 ; i < n ; i ++)
{
cin>>a[i];
}
string t;
cin>>t;
vector<string> res;
for(auto i : a)
{
bool flag = 1;
for(int j = 0 ; j < t.size() ; j ++)
{
if(i[j] != t[j])
flag = 0;
}
if(flag)
{
res.push_back(i);
}
}
sort(res.begin(),res.end());
for(auto i : res)
{
cout<<i<<endl;
}
return 0;
}
运行结果