如何检查字符串的字母是否以给定的顺序存在于另一个字符串中?

时间:2015-06-17 07:38:15

标签: c++ algorithm

我试图制作一个程序来检查单词"nadia"是否与字符串中的此序列一起出现。如果你可以删除零个或多个字符来获得这个单词,那么你应该打印"YES"否则打印"NO"。任何人都可以帮我找到我错过的测试用例吗?当我尝试提交它时,它表示输出错误。

这是我的代码:

#include <iostream>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;

bool nadiaFound(string s){
    int counter = 0;
    char key[5] = { 'n', 'a', 'd', 'i', 'a' };
    for (int i = 0; i < s.size(); i++){
        if (s[i] == key[counter]){
            counter++;
        }
    }
    if (counter == 5){
        return true;
    }
    else { return false; }
}
int main(){
    int T;
    cin >> T;
    string *names = new string[T];

    for (int i = 0; i < T; i++){
        cin >> names[i];
    }
    bool *barr = new bool[T];

    for (int i = 0; i < T; i++){
        barr[i] = false;
    }

    for (int i = 0; i < T; i++){
        if (nadiaFound(names[i])){
            barr[i] = true;
        }
        else{
            barr[i] = false;
        }
    }
    for (int i = 0; i < T; i++){
        if (barr[i]){
            cout << "YES" << endl;
        }
        else {
            cout << "NO" << endl;
        }
    }
    return 0;
}

2 个答案:

答案 0 :(得分:2)

访问导致未定义行为的key[counter]时,您可能会访问绑定内存。一个可能的解决方案是:

for (int i = 0; i < s.size(); i++){
    if (s[i] == key[counter]){
        if(++counter == 5) break;
        // ^^        ^^^^  ^^^^^
    }
}

或将for重写为for (int i = 0; i < s.size() && counter < 5; i++)

答案 1 :(得分:2)

这也可以起作用:

#include <iostream>
#include <string>
using namespace std;

int main(){
    string names; 
    getline(cin,names); 
    cout << names << endl;
    if (names.find("a", names.find("i", names.find("d", names.find("a", names.find("n", 0))))) != string::npos)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
    return 0;
}

函数查找返回的结果指向搜索字符串开始的字符串中的第一个位置或搜索到的字符所在的位置(取决于变体)。

如果搜索失败,则两个函数都返回一个表示为string::npos的特殊值(此值,当用作字符串成员函数中len(或sublen)参数的值时,表示&# 34;直到字符串结束&#34;。)。您可以使用它来检查您的草垛是否包含所需的查找。