检查字符串中每个字符串的数量(简化)

时间:2015-05-13 02:59:59

标签: c++ string for-loop

所以我需要计算一个字符串在字符串中的次数。我之前看到有人发布了一个更复杂的版本,但我的任务要求我不能使用库并且必须手动完成。

下面我创建一个程序,它将在长字符串中找到每个短字符串的开头。

让我们假设

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并在那里放置错误的起始位置。

我做错了什么?问题通常是我无法按照指示使用高级库和代码。

谢谢!

2 个答案:

答案 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;
}