发现子串不起作用

时间:2015-06-14 23:29:16

标签: c++

如果字符串包含“#nadia”,则此代码应返回“是”。没有其他。但是当我提交它时说错误的答案虽然它在样本测试中有所影响。有谁知道我错过了什么?

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
    int t;
    bool flag = false;
    bool flag2 = false;
    bool flag3 = false;
    bool flag4 = false;

    int count = 0;
    vector<string>v;
    cin >> t;
    string x;
        for (int i = 0; i < t; i++)
        {
            cin >> x;
            v.push_back(x);
        }

        for (int i = 0; i < v.size(); i++)
        {
            x = v[i];
            for (int i = 0; i < x.length(); i++)
            {
                if (x.at(i) == 'n')
                {
                    flag = true;
                    for (int i = 0; i < x.length(); i++)
                    {
                        if (x.at(i) == 'a')
                        {
                            ++count;
                            flag2 = true;
                            for (int i = 0; i < x.length(); i++)
                            {
                                if (x.at(i) == 'd')
                                {
                                    flag3 = true;
                                    for (int i = 0; i < x.length(); i++)
                                    {
                                        if (x.at(i) == 'i')
                                        {
                                            flag4 = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if ((flag) && (flag2) && (flag3) && (flag4) && (count >= 2))
            {
                cout << "YES" << endl;

            }
            else
            {
                cout << "NO" << endl;

            }
            count = 0;
            flag = false;
            flag2 = false;
            flag3 = false;
            flag4 = false;
        }

        system("pause");
        return 0;
}

示例输入:

3
anhaldillooa
nnaaddiiaa
nxzdiao

示例输出:

YES
YES
NO

4 个答案:

答案 0 :(得分:1)

你几乎要建立一个状态机来寻找子串。

尝试std::string::find

std::string str ("There are two needles in this haystack with needles.");
std::string str2 ("needle");

// different member versions of find in the same order as above:
std::size_t found = str.find(str2);
if (found!=std::string::npos)
  std::cout << "first 'needle' found at: " << found << '\n';

答案 1 :(得分:0)

如果你出于某种原因拒绝使用string :: find,那么至少要做一个聪明的男孩;)。 另外,检查输出格式。也许你不需要换行新答案?

以下是一些代码:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{   
    int t = 0;
    int pos = 0;
    const char c[5] = {'n', 'a', 'd', 'i', 'a'};

    vector<string> v;
    string x;

    cin >> t;
    for (int i = 0; i < t; i++)
    {
        cin >> x;
        v.push_back(x);
    }

    for (int i = 0; i < v.size(); i++)
    {
        x = v[i];
        for(int j = 0; j < x.length() && pos < 5; j++)
            if(x[j] == c[pos]) pos++;

        if(pos == 5) cout<<"YES ";
        else cout<<"NO ";

        pos = 0;
    }

    return 0;
}

答案 2 :(得分:0)

仅使用for循环代码的替代方法:

bool contains(string input, string target){

        int target_index = 0;

         for(int i = 0; i < input.size(); i++){

            target_index = input.at(i) == target[target_index].at(i) ? target_index + 1 : 0;  

            if(target_character_index + 1 == target.size()) return true; 
         }
         return false;
}

int main()
{
     int size = 0;
     cin>>size;
     string target = "nadia";

     while(size-- > 0){
       string input = "";
       cin>>input;
       cout>>contains(input, target) ? "YES" : "NO";
     }

     return 0;
}

答案 3 :(得分:0)

您的所有循环都以 i = 0 开头。

这意味着您只是在字符串中的任何位置单独查找字符 nadia,与其他所需字符的位置无关。

您根本没有进行子字符串搜索。这只是错误的算法。

您还只测试了所有在一行中找到的“nadia”输入;如果你测试过例如“戴安娜”也是如此,你会发现毫无疑问是由在线测试程序触发的假阳性结果。