今天是【Acwing】字符串专题的总结,本文会持续更新。
字符串
一、输入
1、字符串可能包含空格。
getline(cin,s);
2、输入若干行字符串
s,str都没有空格
while(cin>> s >> sub)
3、读入两个字符串
如果字符串没有空格
string s1,s2;
cin>> s1 >> s2;
如果字符串有空格
getline(cin,s1);
getline(cin,s2);
二、模板总结
1、统计字符串中的数字个数。
for(int i = 0; i < s.size(); i++)
{
if(s[i] >= '0' && s[i] <= '9') count++;
}
2、判断两个字符串的首个字符是否相同。
string x,y;
cin>>x>>y;
if(x[0]-y[0] == 0)
cout<<"YES"<<endl;
如果不相同,可算出相隔几个字符,据此进一步判断。
if(x[0]-y[0] == 1 || x[0]-y[0] == 5 || x[0]-y[0] == -6)
3、寻找ASC最大字符的位置
int idx = 0;
for(int i = 0; i < s.size(); i++)
{
if(s[i] > s[idx]) idx = i;
}
4、统计字符串中每个字符出现的次数。
for(int i = 0; s[i]; i++)
{
cnt[s[i]-'a']++;
}
将字符串中的大写字母转化为小写字母
A-65,a-97
for(int i = 0; x[i]; i++) //注意字符串遍历的这种写法
{
if(x[i]>='A' && x[i]<='Z') x[i]+=32;
}
5、去除掉多余的空格。
string s;
while(cin>> s)
{
cout<< s <<" ";
}
6、单词替换
用到字符串数组。
string a[1010];
int i = 0;
while(cin>> a[i]){ //输入i个数
i++;
}
for(int k = 0; k < i-2; k++)
{
if(a[k] == a[i-2]) cout<< a[i-1] << " ";
else cout<< a[k] <<" ";
}
7、字符串中最长连续出现的字符
string s;
cin>> s;
char c;
int len = s.size();
int cnt = 0;
for(int i = 0; i < len; i++) //这里写一个双指针i,j
{
int j = i;
while(j < len && s[i] == s[j]) j++;
if(j-i > cnt) cnt = j-i,c = s[i];
i = j-1;
}
cout<< c <<' '<< cnt <<endl;
三、函数
1、size()
2、insert()
在下标为idx的字符后面插入sub字符串。
s.insert(idx+1,sub)
3、strcmp()
按照字典序比较两个字符串的大小。
string使用strcmp()要加.c_str()
如果(s1 < s2),t < 0。
如果(s1 == s2),t ==0。
如果(s1 > s2),t > 0。
string s1,s2;
int t = strcmp(s1.c_str(),s2.c_str());
4、back()
s.back()返回最后一个元素的值。
s.pop_back()弹出最后一个元素