c++ 关于find函数(代码搬运工)

之所以会写这篇文章呢,是因为做了洛谷里的一道题(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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值