之所以会写这篇文章呢,是因为做了洛谷里的一道题(P1628 合并序列),明明很简单但是就是有两个点过不去,蒟蒻一枚。
下面是洛谷的P1628 合并序列
题目描述
有 N个单词和字符串 T,按字典序输出以字符串 T 为前缀的所有单词。
输入格式
输入文件第一行包含一个正整数 N;
接下来 N 行,每行一个单词,长度不超过 1000;
最后一行包含字符串 T。
输出格式
按字典序升序输出答案。
输入输出样例
输入 #1复制
6 na no ki ki ka ku k
输出 #1复制
ka ki ki ku
说明/提示
【数据规模】
对于60% 的数据,满足 1≤N≤1000;
对于 100% 的数据,满足 1≤N≤100000 且所有字符均为小写字母。
蒟蒻发言:
这道题有两种解法:
first:sort+find/(sort+find+substr)
second:二叉树queue+find/(二叉树)
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
string a[100005];
string t;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>t;
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
if(a[i].find(t)==0)cout<<a[i]<<endl;
}
return 0;
}
我的差别
if(a[i].find(t)==0)cout<<a[i]<<endl;这里我刚开始是这样写的
if(a[i].find(t)!=-1)cout<<a[i].substr(a[i].find(t))<<endl;
这里我想有找到要求字符位置(string.find()!=-1)就从该位置对原字符串进行截取,
但是题目的意思是前缀为要求字符,不包含处于中间位置,所以(string.find()==0)即可
下面是正文,也是我写这篇文章的主要目的:
string s1,s2,s3
string1.find(string2 (or char a),position)
1、(从前往后搜索)
s1.find(s2),在s1中查找s2第一次出现的位置,无则返回-1
s1.find(s2,2)从s1中的第二个位置开始查找(默认为0),无则返回-1
2、(从后往前搜索)
s1.rfind(s2),在s1中查找s2最后一次出现的位置,无则返回-1
3、(从前往后搜索)
s1.find_first_of(s2),在s1中查找s2内的任意字符第一次出现的位置,无则返回-1
4、(从后往前搜索)
s1.find_last_of(s2),在s1中查找s2内的任意字符最后一次出现的位置,无则返回-1
5、s1.find_first_not_of(s2),在s1中查找不匹配s2内的任意字符第一次出现的位置,无则返回-1
6、s1.find_last_not_of(s2),在s1中查找不匹配s2内的任意字符最后一次出现的位置,无则返回-1
7.s1.find(s2,s1.find(s3))从s1中的找到s3的位置开始查找s2
find的嵌套这个也很重要,需要注意,无则返回-1
上面就是我稍微整理的内容,当然是存在疏漏的内容和错误,希望大家可以共同学习,也可以指出在文章中发现的错误
lasting and positive