#字符串 字符串处理

字符串处理

字符串处理是竞赛中的常见题目,除了简单的字符串查找、替换、匹配等问题以外,还有比较复杂的字符串算法,其中应用广泛的有字符串哈希、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% 困难

补上ASCII表

原文地址:https://www.cnblogs.com/yuanyulin/p/14026716.html