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

How to check whether the letters of a string exist in the given order within another string?

本文关键字:字符串 是否 定顺序 存在 另一个 检查 何检查 一个      更新时间:2023-10-16

我正在尝试制作一个程序来检查单词"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;
}

您可以在访问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++)

这也可以工作:

#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;
}

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

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