本文主要是介绍string (外挂般的存在),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
STL中的string 功能很强大,比字符数组强到不是一丁半点,接下来看看他的用法:
string 的定义 substr操作 insert操作 erase操作 append和replace操作 assign操作 string搜索操作(find 和 rfind) find_….of函数
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{string s,t; //s=("china");//s="china";//s=t; //string s("chian")s="12345"; //1 2 3 4 5t=s;cout<<t<<endl; //1 2 3 4 5cout<<"......"<<endl;string p=s.substr(0,3); //指定从a 开始后面 b个字符的串 cout<<p<<endl; //1 2 3cout<<"......"<<endl;p=s.substr(3); //也可以从a 处到最后的串 cout<<p<<endl; //4 5 可以是一个参数,也可以是两个参数 cout<<"......"<<endl;// 只能初始化的形式 实现 string s1(s,2); //string 是第几个字符后面的字符的串到s1 cout<<s1<<endl; //3 4 5cout<<"......"<<endl;char cs[]="12345"; string s2(cs,2); //char 字符数组 是*前几个字符*的串复制到 s2中 cout<<s2<<endl; //1 2cout<<"......"<<endl;string s3="app"; //string 的插入操作 s.insert(2,s3); //12app345在*前几位*指定位置处插入另一个字符串 //s.insert(2,"app",2); //也可以是三个参数,最后一个是字符串前几位赋值到s cout<<s<<endl; //可以有两个参数 //s.insert(2,s3,0,3); //也可以是4个参数 就是要插入字符串的a到b范围 //cout<<s<<endl; cout<<"......"<<endl;//string 的删除操作 比字符数组 更加灵活,在一些字符串问题中,起到的作用更大 s.erase(0,1); //2app345 就是删掉第一位字符 从a位置开始 删除几个字符 //s+=t[0]; cout<<s<<endl;cout<<"....."<<endl; s.erase(s.begin()); //用迭代器 删除指定位置的字符 cout<<s<<endl; //app345 cout<<"....."<<endl;//s.erase(s.begin(),s.end()); // 全部删除 //cout<<s<<endl;//cout<<"....."<<endl;//string的搜索操作可以来搜索 一个*字符串* 在一个大字符串里面 是否出现过 size_t found=s.find("app"); // size_t 定义 if(found!=string::npos) // 固定的格式 string:: nposcout<<"位置"<<' '<<found<<' '<<"find it"<<endl; //如果没有找到,就是返回结尾//如果找到,那么返回字符串出现的位置 cout<<"......."<<endl;string s5;s5="aaa aa a a aa aaa bbb aa";found=s5.find("aa");while(found!=string::npos){cout<<found<<' ';found=s5.find("aa",found+1); //这个参数可以是1 2 3个 }//1个参数就是 找第一个出现的位置,2个参数就是在哪个 起点开始找,3个参数是找的内个字符串 的前几位 cout<<endl; cout<<"......."<<endl;//string 的 rfind 找最后一个出现的匹配字符串,返回的位置仍然是从前往后数的。string s8="the apple is good good good";size_t found2=s8.rfind("good");if(found2!=string ::npos){cout<<"位置"<<' '<<found2<<' '<<"find it"<<endl;}cout<<"......."<<endl;//append 是追加字符串和字符的,replace是替换操作 s.append("999"); //qpp345999 //s+="999"; //效果一样 cout<<s<<endl;cout<<"........."<<endl;s.replace(1,2,"china"); //achina345999 可以有3个参数,1是要替换的其实位置 //也开始是4个参数和5个参数 cout<<s<<endl;cout<<"......."<<endl;s.replace(1,5,"japana",0,5);//ajapan345999 多了两个参数 就是要插入的字符串的开始位置,和要插入几个字符 cout<<s<<endl;cout<<"........."<<endl;s.replace(1,5,"apple",5); //aapple345999 就是将 要插入字符串的前几位插入 cout<<s<<endl;cout<<"........."<<endl;s.replace(1,5,3,'!'); //a!!!345999 后面两个参数是变成几个那个字符 cout<<s<<endl;cout<<"........."<<endl;//迭代器 来实现 替换操作 s.replace(s.begin(),s.begin()+2,"oooo");cout<<s<<endl; //oooo!!345999cout<<"........."<<endl;//string 的 assign 操作 灵活赋值string s7=s.assign(s); //可以进行赋值字符串 s7.assign(s,0,4); //oooo 需要3个参数,需要插入的字符串,开始位置和几个字符 //s7.assign(s.begin(),s.begin()+4); //可以使用迭代器来做 cout<<s7<<endl;cout<<"........."<<endl;// string的比较可以直接 > < = 来比较 //find...of 函数 // find_first_of(str) 找到str 字符串内每个字符出现的位置并且对该字符进行操作 size_t found3=s.find_first_of("!345");while(found3!=string::npos){s[found3]='#'; //进行操作 found3=s.find_first_of("!345",found3+1); //再去下一位找 }cout<<s<<endl; //oooo#####999cout<<"......."<<endl;//find_first_not_of(str) 找到第一个不在 str 内的字符 size_t found4=s.find_first_not_of("9");while(found4!=string::npos){s[found4]='9';found4=s.find_first_not_of("9",found4+1);}cout<<s<<endl; // 999999999999cout<<"......"<<endl;//find_last_of(str) 找到 str 中任意一个字符最后 出现的位置 //find_last_not_of(str) 找到最后一个不存在 在str串中的字符 return 0;
}
来看两道题 ,你肯定会喜欢上 string 的:
链接:https://ac.nowcoder.com/acm/problem/21179
来源:牛客网
题目描述
Rabbit得到了一个字符串,她的好朋友xxx可以给这个字符串施加一次魔法。
魔法可以选择字符串的任一位置,并将该位置后面的所有字符水平拼接到串首。
例如:对于字符串abcde,可以通过施加魔法得到cdeab。
如果xxx通过施加魔法将字符串的字典序变得严格比之前的小,那么他将拿走这一字符串。
Rabbit想知道自己的字符串会不会被xxx拿走。
输入描述:
第一行一个整数n,表示字符串的长度。接下来一行一个长度为n的只由小写字母组成的字符串。
输出描述:
如果Rabbit的字符串会被xxx拿走,输出“YES”。
否则输出“NO”。
(不输出引号)
示例1
输入
复制
5
cdeab
输出
复制
YES
说明
xxx可以把e之后的部分“ab”放到串首,得到abcde,字典序比cdeab小,故将拿走字符串。
示例2
输入
复制
5
abcde
输出
复制
NO
备注:
1≤n≤100000
就是把后面的部分字符串放到字符串首,如果是严格的,并且比初识的串字典序小,那就输出YES,否则就输出NO。
说说思路吧:一开始理解错误思路,我想的是只要有比首字符ASCLL小的,就是NO,但是如果是abadcg 我就是输出NO,应该是YES。于是,大神代码,用了灵活操作的 string 来做这道题。就是每次把第一位字符已到最后一位,然后比较此时字符串与初始字符串字典序哪个大。如果不满足,就继续移动,直到字典序小为止。相对于字符数组,删除移动操作比较麻烦,但是 string是很简单的,大家可以遇见这种问题,可以首先考虑 string 的用法,相对于简单。
#include <bits/stdc++.h>
using namespace std;
int main()
{string s, t;scanf("%*d");cin >> s;t = s;for (int i = 1; i < t.size(); i++){t += t[0];t.erase(0,1);if (t < s){puts("YES");return 0;}}puts("NO");
}
2.看题
链接:https://ac.nowcoder.com/acm/contest/333/I
来源:牛客网
题目描述
最近Jhadgre拿到了一个系列表情包,他很高兴,于是他给每个关系好的女性好友都送了一盒饼干外带这一套表情包。
结果让他惊呆了,竟然真的有女孩子答应他........再来一盒(不然你以为?)
当然也有人回复一些其他的消息...唯独没有答应做他女朋友的人。
Jhadgre很伤心,但是作为一个有原则的人,既然答应了送别人小饼干,那就必须要给!
所有人的回复都由大写字母,小写字母与','组成,占一行,Jhadgre认为只要其中包含了连续的10个小写字母"zailaiyihe"就意味着这个人想要再来一盒。
现在Jhadgre准备给每一个想要“再来一盒”的人买一盒小饼干,他想知道总共需要买几盒小饼干?
输入描述:
第一行一个整数N,表示有N个人回复(1<=N<=1000)
接下去N行每行都是一个人的回复,由大写字母,小写字母与','组成。
(数据保证每行字符不超过1000个)
输出描述:
一个整数表示Jhadgre需要买几盒小饼干
示例1
输入
复制
3
Bu,xing
wokeyizailaiyihe
no
输出
复制
1
刚拿道题,完全没有思路,难道是KMP算法,大一没有开数据结构,怎么办,还是看看大神的代码学习一下:
一看这么短的代码,还带上“水题”的标签,哎,我太菜了。
就是用了string 的一个搜索str.find() 函数,就可以AC掉。那个格式string::npos 是一定的。
代码:
#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
using namespace std;
#include<string.h>
const int maxn=1005;
typedef long long ll;
int main()
{int n;int k=0;cin>>n;while(n--){string a;cin>>a;if(a.find("zailaiyihe")!=string::npos){k++;}}cout<<k<<endl; return 0;
}
https://blog.csdn.net/tengfei461807914/article/details/52203202 推荐看看详解。
https://blog.csdn.net/fioletfly/article/details/53941954
这篇关于string (外挂般的存在)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!