合并序列
题目描述
有 N N N 个单词和字符串 T T T,按字典序输出以字符串 T T T 为前缀的所有单词。
输入格式
输入文件第一行包含一个正整数 N N N;
接下来 N N N 行,每行一个单词,长度不超过 100 100 100;
最后一行包含字符串 T T T。
输出格式
按字典序升序输出答案。
样例 #1
样例输入 #1
6
na
no
ki
ki
ka
ku
k
样例输出 #1
ka
ki
ki
ku
提示
【数据规模】
对于 60 % 60\% 60% 的数据,满足 1 ≤ N ≤ 1000 1 \le N \le 1000 1≤N≤1000;
对于 100 % 100\% 100% 的数据,满足 1 ≤ N ≤ 100000 1 \le N \le 100000 1≤N≤100000 且所有字符均为小写字母。
题解
这是一道判断字符串前缀的问题,在前缀符合的时候按字典序输出。
使用c++中的**sort()**可以很好的解决字典序排列的问题,将字符串数组,字符串数组+长度传入sort函数即可。
首先写一个判断当前字符串和判定前缀是否符合的函数issame(),传入i,i是字符串数组string s[]的第i位,即当前判断的单词下标,lens是当前这个单词的长度,会在主函数中计算,lent是判定前缀的长度,一样会在主函数中计算。
从当前单词的第一位开始判断,在不超过字符长度的情况下j++,声明一个k来记录判定前缀当前判定到第几个了,所以需要每次判断的时候都初始化为0,当单词第j位s[i][j]和前缀第k位t[k]不相等的时候直接return false标记这个单词不符合,在一位判断结束后k++,for循环结束后返回true,表示此单词符合。 我最开始写的时候只判断了第一位,循环逻辑有一些问题,还是要写下来仔细模拟判断逻辑才比较严谨。
bool issame(int i,int lens,int lent) {
int k = 0;
for (int j = 0; j < lens&&k<lent; j++) {
if (s[i][j] != t[k]){
return false;
}
k++;
}
return true;
}
main函数关键代码如下:先计算各字符串长度,在调用判断函数来判断当前是否符合,符合的话存入结果字符串数组res中,事先声明一个int b来记录结果数组中的位置。直接用sort函数来对结果数组进行字典序排列。
for (int i = 0; i < n; i++) {
lens = s[i].length();
lent = t.length();
flag = issame(i, lens, lent);
if (flag == true) {
res[b] = s[i];
b++;
}
}
sort(res, res + b);
完整代码如下:
#include <iostream>
#include<sstream>
#include<stdio.h>
#include<iomanip>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
//P1628 合并序列
int n; string s[1000005]; string t; string res[100005];
bool flag; int b=0;
bool issame(int i,int lens,int lent) {
int k = 0;
for (int j = 0; j < lens&&k<lent; j++) {
if (s[i][j] != t[k]){
return false;
}
k++;
}
return true;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> s[i];
}
cin >> t;
int lens, lent;
for (int i = 0; i < n; i++) {
lens = s[i].length();
lent = t.length();
flag = issame(i, lens, lent);
if (flag == true) {
res[b] = s[i];
b++;
}
}
sort(res, res + b);
for (int i = 0; i < b; i++) {
cout << res[i]<<endl;
}
}
亲测已AC!