字符串处理
字符串处理是竞赛中的常见题目,除了简单的字符串查找、替换、匹配等问题以外,还有比较复杂的字符串算法,其中应用广泛的有字符串哈希、KMP、字典树(Trie Tree),AC自动机和后缀数组等。
字符串基本操作
读入
查找
替换
截取
数字和字符串转换
读入 gets()和getchar()
读字符: char ch1;ch1=getchar();
读字符串: char str[1002];gets(str);
String类: string str;getline(cin,str);
POJ 3981 字符串替换
编写一个C++程序实现将字符串中的所有"you"替换成"we"
Input
输入包含多行数据
每行数据是一个字符串,长度不超过1000
数据以EOF结束
Output
对于输入的每一行,输出替换后的字符串
Sample Input
you are what you do
Sample Output
we are what we do
85 wind
83 memory
【C程序1】
下面的程序一次读取一个完整的字符串,用gets()函数实现。
在比赛中不建议使用gets()函数。
#include<cstdio>
char str[1002];
int main(){
int i;
while(gets(str)!=NULL){
for(int i=0;str[i]!=' ';i++){
if(str[i]=='y'&&str[i+1]=='o'&&str[i+2]=='u'){
printf("we");
i+=2;
}
else
printf("%c",str[i]);
}
printf("
");
}
return 0;
}
【C程序2】
下面的程序一次只读一个字符,用getchar()函数实现。这个程序比上一个程序要好,因为它不需要定义一个字符串数组,当然也不用考虑数组的大小。
#include<cstdio>
int main(){
char ch1,ch2,ch3;
while((ch1=getchar())!=EOF){
if(ch1=='y'){
if((ch2=getchar())=='o'){
if((ch3=getchar())=='u')
printf("we");
else
printf("yo%c",ch3);
}else
printf("y%c",ch2);
}
else
printf("%c",ch1);
}
return 0;
}
使用cin读入字符串时,遇到空白就停止读取,有时我们想把一个句子存下来,又不想创建多个string来存储单词,怎么办?
那就用getline来获取一整行内容。
【C程序3】
下面的程序用到string类,getling()函数
#include<iostream>
#include<string>
using namespace std;
int main(){
string str;
int pos;
while(getline(cin,str)){
while((pos=str.find("you"))!=-1)
str.replace(pos,3,"we");
cout<<str<<endl;
}
return 0;
}
C++ STL中最基本以及最常用的类或容器无非就是以下几个:vector、set、list、map、String
用string初始化字符串分两类:用“=”号就是拷贝初始化,否则就是直接初始化。
使用const_iterator使得访问元素时是能读不能写,这跟常量指针意思差不多。
string str("hi you");
for (string::const_iterator it = str.begin(); it != str.end(); it++){
cout << *it << endl;
*it = 'k'; //这是错误的,不能写
}
C++ 字符串长度:
求字符串长度用.size()或者.length()
不要用sizeof()
c++ 删除字符串指定位置的字符
string erase(int start, int len);
//start为要删除字符的起始位置(从0数起),len为要删除字符的个数。
截取子串
s.substr(pos, n)
//截取s中从pos开始(包括0)的n个字符的子串,并返回
s.substr(pos)
//截取s中从从pos开始(包括0)到末尾的所有字符的子串,并返回
替换子串
s.replace(pos, n, s1)
//用s1替换s中从pos开始(包括0)的n个字符的子串
查找子串
s.find(s1)
查找s中第一次出现s1的位置,并返回(包括0)
s.rfind(s1)
查找s中最后次出现s1的位置,并返回(包括0)
s.find_first_of(s1)
查找在s1中任意一个字符在s中第一次出现的位置,并返回(包括0)
s.find_last_of(s1)
查找在s1中任意一个字符在s中最后一次出现的位置,并返回(包括0)
s.fin_first_not_of(s1)
查找s中第一个不属于s1中的字符的位置,并返回(包括0)
s.fin_last_not_of(s1)
查找s中最后一个不属于s1中的字符的位置,并返回(包括0)
字符串基本操作练习列表:
760 字符串长度 60.54% 简单
761 字符串中的数字个数 51.48% 简单
762 字符串匹配 25.98% 简单
763 循环相克令 42.67% 简单
764 输出字符串 31.50% 简单
765 字符串加空格 53.89% 简单
766 去掉多余的空格 66.67% 简单
767 信息加密 43.23% 简单
768 忽略大小写比较字符串大小 34.18% 简单
769 替换字符 72.00% 简单
770 单词替换 51.89% 中等
771 字符串中最长的连续出现的字符 60.00% 中等
772 只出现一次的字符 40.88% 中等
773 字符串插入 48.28% 中等
774 最长单词 52.03% 中等
775 倒排单词 81.82% 中等
776 字符串移位包含问题 44.23% 困难
777 字符串乘方 78.12% 困难
778 字符串最大跨距 37.86% 困难