字符串常用操作
添加头文件#include<string>
1.通过迭代器访问字符串
#include<string>
string str="hello world";
for(string::iterator it=str.begin();it!=str.end();++it)
{
cout<<*it<<" ";
}
//得到 h e l l o w o r l d
2.在字符串中插入元素
//向str中插入
str.insert(x,s0);//x为插入位置的下标,s0为插入内容
3.删除字符串中的指定内容
str.erase(x,n);//x为删除开始的下标,n为删除长度
str.erase(x);//从x开始,后面都删掉
4.替换字符串中的内容
str.replace(起始位置,长度,替换内容);
5.字符串翻转
注意:reverse()函数属于algorithm头文件,而非string
reverse(str.begin(),str.end());//全部翻转
reverse(str.begin()+x,str.end()+y);//指定区域翻转,用x,y控制
6.含空格的字符串
若按照string直接输入,则遇到空格就会停止;应该如下操作
string str;
getlin(cin,str);
7.字符数组直接输出
char arr[10];
//输入省略了
puts(arr);
8.查找字符串内容
str.find("字符串")
str.find('字符')
返回值均为对应下标,若找不到则返回值为string::npos
9.按字典顺序排序
题目如下
其中,strcmp函数中的两个参数均为字符数组,而非字符串
strcpy(str1,str2+i)函数将str2从第i位开始的部分复制到str1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
struct s
{
char str[101];
bool operator < (const s &a) const//类函数中重载小于号,实现类字典序
{
return strcmp(str,a.str)<0;
}
}buf[101];
int main()
{
while(gets(buf[0].str))
{
int length=strlen(buf[0].str);
for(int i=0;i<length;i++)
{
strcpy(buf[i+1].str,buf[0].str+i+1);//把后者字符串复制到前一字符串
}
sort(buf,buf+length);//排序
for(int i=0;i<length;i++)
{
cout<<buf[i].str<<endl;
}
}
return 0;
}
字符串匹配:KMP算法
- 求next数组
- 使用KMP算法,匹配则继续;失配则回溯
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
const int MAXN=1000000;
int nextTable[MAXN];
void GetNext(string pattern)
{
int m=pattern.size();
int j=0;
nextTable[j]=-1;
int i=nextTable[j];
while(j<m)
{
if(i==-1||pattern[i]==pattern[j])
{
i++;
j++;
nextTable[j]=i;
}
else
{
i=nextTable[i];
}
}
return ;
}
int KMP(string text,string pattern)
{
GetNext(pattern);//先求next数组
int n=text.size();
int m=pattern.size();
int i=0;//i标记原串
int j=0;//j标记模式串
int number=0;
while(i<n)//按原串长度遍历
{
if(j==-1||text[i]==pattern[j])//当前字符匹配成功
{
i++;
j++;
}
else//当前字符失配
j=nextTable[j];//回退
if(j==m)//匹配成功,但题目要求找到所有匹配的子串
{
number++;//匹配的子串数
j=nextTable[j];//回退,继续匹配
}
}
return number;
}
int main()
{
string text,pattern;
while(cin>>text)
{
cin>>pattern;
cout<<KMP(text,pattern)<<endl;
}
return 0;
}