所以我需要计算一个字符串在字符串中的次数。我之前看到有人发布了一个更复杂的版本,但我的任务要求我不能使用库并且必须手动完成。
下面我创建一个程序,它将在长字符串中找到每个短字符串的开头。
让我们假设
string longword = "bigbigbiggbigbigbiig;
string shortword = "big" ;
for (int i = 0; i < 20;)
{
for(int j = 0; j < 3; j++)
{
if(longword[i]==shortword[j])
{
i++;
}
}
cout << (i-(shortword)+1) << ", ";
}
我的问题是下面的输出有时会连续读取像iii这样的单词,或者连续读取ggg。你可以看到它的工作原理,直到它结束它在0,3,6,10,13,15,17
开始的输出。问题是它正常工作直到6然后它读取7并在那里放置错误的起始位置。
我做错了什么?问题通常是我无法按照指示使用高级库和代码。
谢谢!
答案 0 :(得分:3)
如果不考虑性能,可以从以下代码开始
string longword = "bigbigbiggbigbigbiig;
string shortword = "big" ;
for (int i = 0; i < longword.size(); ++i)
{
bool found = true;
for(int j = 0; j < shortword.size(); ++j)
{
if(longword[i + j]!=shortword[j])
{
found = false;
break;
}
}
if (found) cout << i << ", ";
}
如果您关注性能,可以在字符串搜索中搜索Knuth-Morris-Pratt算法或类似主题。
答案 1 :(得分:0)
如果我被允许修补程序..
#include<iostream>
using namespace std;
int main()
{
char longword[] = "bigbigbiggbigbigbiig";
char shortword[] = "big" ;
int i=0,j=0,k=0,l=0;
while(longword[i]!='\0')
{
j=0;
k=0;
while(shortword[j]!='\0')
{
if(shortword[j]==longword[i])
{
k++;
j++;
i++;
}
else
j++;
}
if(k==3)
l++;
}
cout<<l;
}