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 5
	t=s;
	cout<<t<<endl;      //1 2 3 4 5
	cout<<"......"<<endl;
	
	string p=s.substr(0,3);		 //指定从a 开始后面 b个字符的串 		
	cout<<p<<endl;				//1 2 3
	cout<<"......"<<endl;
	
	
	p=s.substr(3);     			//也可以从a 处到最后的串	
	cout<<p<<endl; 	//4 5		可以是一个参数,也可以是两个参数 
	cout<<"......"<<endl;


	// 只能初始化的形式 实现 
	string s1(s,2);		//string 是第几个字符后面的字符的串到s1  
	cout<<s1<<endl;		//3 4 5
	cout<<"......"<<endl;

	char cs[]="12345";        
	string s2(cs,2);	//char 字符数组 是*前几个字符*的串复制到 s2中  
	cout<<s2<<endl;      //1 2
	cout<<"......"<<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:: npos
		cout<<"位置"<<' '<<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!!345999
	cout<<"........."<<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#####999
	cout<<"......."<<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;  // 999999999999
	cout<<"......"<<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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值