2

我的任务是在一个句子(更像是一行字符)中找到“EYE”这个词,例如:EYEYECARASDFG. 如您所见,“EYE”一词出现了两次,彼此重叠。我想cout“EYE”这个词在句子中出现了多少次。我写了一些看起来像这样的代码:

#include <iostream>
#include <string>

using namespace std;

string sentence;

int main()
{
    int i = 0;
    cin >> sentence;

    while()
    {
        if (std::string::npos != sentence.find("EYE"))
        {
            i++;
        }
    }


    cout << i;
}

现在没有while循环,它会在句子中找到 EYE 并且它有点工作。所以我虽然,要计算重叠并使代码运行直到它结束,我需要循环它。所以我虽然 while 循环是最好的,但我不知道如何循环它,将什么放入括号 forwhile循环

4

4 回答 4

2

首先条件 inwhile是必需的。如果您想要无限循环,请使用true您的语句。作为初稿,请尝试使用“蛮力”进行制作。如果等于“EYE”,只需检查句子的每 3 个字母子串。它将是一个循环和 3 个条件或 2 个循环和 1 个条件。然后阅读一些文本搜索算法,例如KMP

如果您只想让此代码运行,请使用以下 coed:

int pos = 0;
while(true) { 
    pos =  sentence.find("EYE", ++pos);
    if (pos != std::string::npos) {
        i++;
    } else break;
 }
于 2012-11-26T13:50:15.600 回答
1

您可以使用有限状态机来执行此操作。(谷歌它。)这是有效且易于理解的。当您阅读这些字符时,需要区分三种状态,即,1) 最近看到的字母是“E”时,2) 最后看到的两个字母按顺序是“EY”时,以及 3) 其他所有字母。当您一次通过一个字符时,每当您处于状态 2 并找到另一个“E”时,将“找到”计数加一。

看看你是否可以在没有更多提示的情况下从那里拿走它。

这个想法可以扩展到“EYE”之外的任意字符串,您可以编写各种编译器来为这些字符串生成有限状态机。但这是一个更高级的任务。

于 2012-11-26T13:47:24.740 回答
0
#include<iostream>
#include<string>
using namespace std;
main()
{
        string sen, sub;
        int pos;
        cout<<"Enter the Sentence"<<endl;
        getline(cin,sen);
        cout<<"Enter string to find"<<e`ndl;
        cin>>sub;
        for (int i=1;(pos=sen.find(sub)) != -1 ;i++)
        {
                sen=sen.substr(++pos);
                cout<<"Found = "<<sub<<" "<<i<<" Times"<<endl;
        }``


}
于 2017-05-21T13:07:51.680 回答
0

代码片段:

#include <bits/stdc++.h>
using namespace std;



int main()
{
    string input, word;
    getline(cin, input);
    cin>>word;

    int cnt=0;
    size_t pos = input.find(word, 0);
    while(pos != string::npos)
    {
        cnt++;
        pos = input.find(word, pos+1);
    }
    cout<<cnt<<endl;

    return 0;
}

输入:
Python 编程 Python
Python

输出:2

于 2017-10-23T21:27:53.800 回答