acwing字符串习题

本文详细介绍了C++编程中涉及的字符串操作,包括字符数组的声明、初始化、复制,以及标准库中的string类型。讨论了读写字符串的方法,如getline和cin.getline,以及如何遍历字符数组和string对象。同时,还涵盖了字符串比较、字符计数、字符替换等常见操作。
摘要由CSDN通过智能技术生成

知识点

//字符串就是字符数组加上结束符\0;
//字符数组的长度至少比字符串的长度多1;
/*
#include<iostream>
using namespace std;
int main()
{
	char s1[]={"c","+","+"};//列表初始化 没有空字符
	char s2[]={"c","+","+","\0"};//列表初始化,含有显示的空字符
	char s3[]="c++";//自动添加表示字符串结尾的空字符
	char s4[6]="daniel"  //错误的 因为没有空间可以放空字符
	return 0;
}
*/

/*
//输入输出
#include<iostream>
using namespace std;
int main()
{
	char str[100];
	//cin >> str;// 以空格为止
	//scanf("%s",str);//只用数组名 不用&   以空格为止
	//cin >> str + 2;  //从下标2开始
	//fgets(str,100000000,stdin); //可以读入空格 可以读入回车
	
	//	getline(cin ,str);// 如果是string 类型 用getline可以读入空格
	cin.getline(str,1000); //char 型可以读入空格
	//cout << str<<endl;
	//cout << str+2;  //从下标2开始输出
	puts(str);
	//printf("%s\n",str);
	return 0;
}
*/

//strcpy函数
/*   
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	char s2[100];
	char s1[10]="scdf";
	strcpy(s2,s1);
	cout << s1<<endl<<s2<<endl;//都是scdf;
	return 0;
}
*/
 
 /*
 //遍历字符数组中的字符
#include<iostream>
using namespace std;
int main()
{
	char s[100]="abcd";
	for(int i=0;s[i];i++)
	{
		cout << s[i] <<endl;
	}
	return 0;
}
*/


//标准库类型string  可变长的字符序列 
//定义和初始化
/*
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1; //默认初始化 s1是一个空字符
	string s2=s1;
	string s3="hello";
	//string s4=(10,'c')//10个c
	cin >> s1;
	//cout <<s1;
	printf(s1.c_str());  //不能用printf直接输出
	return 0;
}
*/


/*
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1="abc";
	string s2;
	cout << s1.empty()<<endl;  //0
	cout <<s2.empty()<<endl;  //1
	cout <<s1.size()<<endl; //3
	cout <<s2.size()<<endl;  //0
	return 0;
}
*/

//string的比较  直接用> < >= <= !=
//当把string 对象和字符字面值及字符串字面值混在一条语句中使用时 必须确保每个加法运算符的两侧的运算对象至少有一个是 string 
/*
#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s1="abc";
	string s2="acd";
	//cout << s1+s2 <<endl;  //string 对象相加
	//for(char c:s1)   cout <<c <<endl;  //遍历
	for(char &c:s1) c='z';  //改变s1中的值  全是z了
	cout <<s1 <<endl;
	return 0;	
}
*/

题目描述

 代码如下

#include<iostream>
using namespace std;
char s[100010];
int cnt[26];//计算每个字符出现的次数
int main()
{
	cin.getline(s,100010); //可以读入空格
	for(int i=0;s[i];i++)
	{
		cnt[s[i]-'a']++;
	}
	for(int i=0;s[i];i++)
	{
		if(cnt[s[i]-'a']==1)
		{
			cout << s[i]<<endl;
			return 0;  //结束
		}
	}
	cout << " no ";
	return 0;
}

题目描述

 代码如下


#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s;
	getline(cin,s);
	for(int i=0;i<s.size();i++)
	{
		if(s[i]>='a'&&s[i]<='z') //s[i]-'a':排多少位 s[i]-'a'+1:题目要求下一位 %26:会转回去
		{
			s[i]=(s[i]-'a'+1)%26+'a';
		}
		else if(s[i]>='A'&&s[i]<='Z')
		{
			s[i]=(s[i]-'A'+1)%26+'A';
		}	
	}
	cout << s;
	return 0;
}

题目描述

 代码如下

//转换成数字之后找规律
#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	string s1,s2;
	while(n--)
	{
		cin >> s1>> s2;
		int x,y;
		if(s1=="Hunter") x=0;
		else if(s1=="Bear") x=1;
		else x=2;
		if(s2=="Hunter") y=0;
		else if(s2=="Bear") y=1;
		else y=2;
		if(x==y) cout << "Tie"	;
		else if(x==(y+1)%3) cout << "Player1";  //规律
		else cout << "Player2";	
	}
	return 0;
}

题目描述

 代码如下

#include<iostream>
using namespace std;
int main()
{
	string a,b;
	getline(cin,a);
	getline(cin,b);
	for(int i=0;i<a.size();i++)
	{
		if(a[i]>='A'&&a[i]<='Z')
		{
			a[i]=a[i]+32;
		}
	}
	for(int i=0;i<b.size();i++)
		{
			if(b[i]>='A'&&b[i]<='Z')
			{
				b[i]=b[i]+32;
			}
		}
	if(a<b)	 cout << " < ";
	else if(a>b) cout << " > ";
	else cout << " = ";
	return 0;
}
*/

题目描述

 代码如下


//substr函数:(左闭右开)求个字符串中某一段 substr(角标,长度) substr(角标):直接到结尾

#include<iostream>
using namespace std;
int main()
{
	string a,b;
	while(cin>>a>>b)
	{
		int p=0;//记录角标
		for(int i=0;i<a.size();i++)
		{
			if(a[i]>a[p])
			p=i;
		}
		cout <<a.substr(0,p+1)+b+a.substr(p+1);
	}
	return 0;
}

题目描述

 代码如下

#include<iostream>
using namespace std;
int main()
{
	double k;
	cin >> k;
	string a,b;
	cin >> a;
	cin >> b;
	int n=0;
	int len=a.size();
	for(int i=0;i<len;i++)
	{
		if(a[i]==b[i])
		{
			n++;
		}
	}
	if((double)n/len>=k) cout << "yes";
	else cout << "no";
	return 0;
}

题目描述

 代码如下

#include<iostream>
using namespace std;
int main()
{
	string s;
	getline(cin,s);
	string z;
	for(auto c:s)
	{
		z=z+c+" ";// 注意string加法规则,不能写z+=c+" "
	}
	z.pop_back();//删去最后一个空格
	cout << z;
	return 0;
}

 代码如下

//cin 不会读入空格  所以用cin每读入一个字符串都在后面加一个空格
/*
#include<iostream>
using namespace std;
int main()
{
	string s;
	while(cin >> s)
	{
		cout << s <<" ";
	}
	return 0;
}
*/

//第二种做法 手动去掉多余的空格 双指针算法
/*
#include<iostream>
using namespace std;
int main()
{
	string s; //原字符串
	getline(cin,s);
	string r; //答案字符串
	for(int i=0;i<s.size();i++)
	{
		if(s[i]!=' ') r+=s[i];
		else 
		{
			r+=' ';
			int j=i;//j用来遍历当前连续空格
			while(j<s.size()&&s[j]==' ') j++;//去掉连续的空格
			i=j-1; //i++之后等于j
		}
	}
	cout << r;
	return 0;
}
*/

//第三种做法 局部性判断
/*
#include<iostream>
using namespace std;
int main()
{
	string s; //原字符串
	getline(cin,s);
	string r; //答案字符串
	for(int i=0;i<s.size();i++)
	{
		if(s[i]!=' ') r+=s[i];
		else 
		{
			if(!i||s[i-1]!=' ') r+=' ';  //第一个元素或者前一个元素不是空格的时候加空格
		}
	}
	cout << r;
	return 0;
}
*/

 代码如下


#include<iostream>
using namespace std;
int main()
{
	string a,b;
	getline(cin,a);
	for(int i=0;i<a.size();i++)
	{
		b+=(char)(a[i]+a[(i+1)%a.size()]); 
         //(char)强制类型转换  a[i]如果是最后一个的话 a[i+1]应该是第一个
	}
	cout << b;
	
	return 0;
}

代码如下


#include<iostream>
#include<sstream>//可以把一个字符串初始化一个类似cin的东西,从字符串中读出任意需要的格式的信息 
using namespace std;
int main()
{
	string  s;
	getline(cin,s);
	string a,b;
	cin >> a>>b;
	stringstream ssin(s); //初始化  ssin只是一个名字
	string str;
	while(ssin>> str)   //把ssin当作cin  
	{
		if(str==a) cout << b<< ' ';
		else cout <<str<< ' ';
	}
	return 0;
}

代码如下


#include<iostream>
using namespace std;
int main()
{
	int n;
	cin >> n;
	while(n--)
	{
		 string s;
		 cin>>s;
		 int cnt =0;  //计数
		 char c;
		 for(int i=0;i<s.size();i++)
		 {
		 	int j=i; //双指针
		 	while(j<s.size()&&s[j]==s[i]) j++;  
		 	if(j-i>cnt) cnt=j-i,c=s[i];
		 	i=j-1;//上边儿有i++
		 }
		 cout << c << ' ' << cnt << endl;
	}
	return 0;
}

 

代码如下


#include<iostream>
using namespace std;
int main()
{
	string r;//存答案
	string s;
	while(cin>>s)
	{
		if(s.back()=='.')  s.pop_back();
            //s.back():最后一个字符  s.pop_back():去掉最后一个字符
		if(s.size() > r.size())  r=s;
	}
	cout << r << endl;
	return 0;
}

代码如下


#include<iostream>
using namespace std;
int main()
{
	string s[100];
	int n=0;
	while(cin>>s[n]) n++;
	for(int i=n-1;i>=0;i--)
	{
		cout << s[i] <<' ';
	}
	cout << endl;
	return 0;
}

代码如下


#include<iostream>
using namespace std;
int main()
{
	string a,b;
	cin>>a>>b;
	if(a.size()<b.size()) swap(a,b);//保证a是较长的字符串
	for(int i=0;i<a.size();i++)
	{
		a=a.substr(1)+a[0];   
            //把第一个位置移到最后 a.substr(1):从1开始表明把0去掉 ,再在最后加上0
		for(int j=0;j+b.size()<=a.size();j++)
		{
			int k;
			for(k=0;k<b.size();k++)
			if(a[j+k]!=b[k]) break; //对应位置不相等
			if(k==b.size())
			{
				cout << "ture" ;
				return 0;
			}
		}
	}
	cout << "false";
	return 0;
}

代码如下

#include<iostream>
using namespace std;
int main()
{
	string str;
	while(cin>>str,str!=".")
	{
		int len=str.size();
		for(int n=len;n>=0;n--)
		{
			if(len%n==0)
			{
				int m=len/n;  //求一个的长度
				string s=str.substr(0,m);
				string r;
				for(int i=0;i<n;i++) r+=s;
				if(r==str)
				{
					cout << n << endl;
					break;
				}
			}
		}
	}
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值