KMP
//KMP
const int MAXM = 100;
int nextTable[MAXM];
void GetNextTable(string pattern){
int i = 0;
nextTable[i] = -1; //next数组第一位默认为-1
int j = nextTable[i]; //j是模式串中第i个字符的next值
while(i < pattern.size()){ //i<length则j一定小于length
if(j == -1 || nextTable[i] == nextTable[j]){
i++;
j++;
//匹配成功时
//nextable[i + 1] = nextable[i] + 1
//但此处i,j已经++,且j = nextable[i]所以为:
nextTable[j] = i;
}else{
i = nextTable[i];
}
}
}
int KMP(string str1,string str2){
GetNextTable(str2);
int n = str1.size();
int m = str2.size();
int i = 0;
int j = 0;
while(i < n || j < m){
if(j == -1 || str1[i] == str2[j]){
i++;
j++;
}else{
j = nextTable[j];
}
}
if(j == m){
return i - j + 1;
}else{
return -1;
}
}
统计字符:
一个简单的思路是用一个整形数组统计各个字符出现的次数
int num[128];//常见的定义到128就够了,如果不放心可以定义到256 char的上限
string str1,str2;
while(getline(cin,str1)){
if(str1 == "#"){
break;
}
memset(num,0,sizeof(num));
getline(cin,str2); //初始化数组
for(int i = 0;i < str2.size();i++){
num[str2[i]]++;
}
for(int i = 0;i <str1.size();i++){
cout << str1[i] << ' ' << num[str1[i]] << endl;
}
}
字母统计:
思路与上题相同
int num[128];
string str;
while(getline(cin,str)){
memset(num,0,sizeof(num));
for(int i = 0;i < str.size();i++){
num[str[i]]++;
}
for(int i = 65;i < 65 + 26;i++){
cout << char(i) << ":" << num[i] << endl;
}
}
单词替换
思路1:设字符串为s1,要替换的单词s2,替换内容s3。设两个标记位f1、f2,f1指向单词后的空格,f2指向每个单词的第一个字母。遍历s1,每当遇到空格或遍历到字符串结束时进行一次判断,更新f1和f2,截取f1和f2之间的单词st与s2对比,如果相同则输出s3,不相同输出st。
string s1, s2, s3;
while (getline(cin, s1), getline(cin, s2), getline(cin, s3))
{
int f1 = -1, f2;
for (int i = 0; i <= s1.size(); i++)
{
if (s1[i] == ' ' || i == s1.size())
{
f2 = f1 + 1;//f2指向单词第一个字符
f1 = i;//f1指向空格
string st = s1.substr(f2, f1 - f2);//substr函数用来替换字符串
if (st == s2)
cout << s3;
else
cout << st;
if (i != s1.size())
cout << ' ';
}
}
cout << endl;
}
思路二:
关键在思维的变换,猛一看输入的都是一行一行的,下意识用getline,但其实可以直接输入,通过利用空格实现将单词分离
string a,b,s[200];
int k=0;
char ch;
do{ //用dowhile将单词分开后并记录在字符数组中
cin>>s[k];
k++;
scanf("%c",&ch);
}while(ch==' ');
cin>>a>>b;
for(int i=0;i<k;i++){
if(s[i]==a){ //若与所给要替换的单词相等,输出替换单词
cout << b << " ";
}else{
cout << s[i] << " ";
}
}