Составление строки из второй строки, порядок символов

#c

Вопрос:

В принципе, мне нужно проверить, могут ли символы, найденные во второй строке, составить первую строку. Программа работает, однако у меня есть проблема в том, что она не учитывает порядок символов.

Например, если я введу:

UMC UniverseCeeMake ==> Yes

но он должен ввести «Нет», потому что UMC != UCM, как я могу заставить его проверить порядок символов? кто-нибудь может помочь?

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

const int MAX = 256;

bool canMakeStr2(string str1, string str2)
{

    int count[MAX] = {0};
    for (int i = 0; i < str1.length(); i  )
        count[str1[i]]  ;

    for (int i = 0; i < str2.length(); i  )
    {
        if (count[str2[i]] == 0)
           return false;
        count[str2[i]]--;
    }
    return true;
}

int main()
{   
    int n;
    string str1;
    string str2;

    cin>>n;
    for(int i =0;i<n;i  ){
        cin >> str1 >> str2;
        if(str1.length()<=10000 amp;amp; str2.length()<=10000)
          if (canMakeStr2(str2, str1))
       cout << "Yes";
    else
       cout << "No";

    }

    return 0;
}
 

Комментарии:

1. Вы не можете реализовать это с помощью (нескольких)наборов (или int[256] эффективно используемых как один). На самом деле использование набора здесь делает это более сложным, чем необходимо. Просто начните с начала обеих строк, а затем повторите попытку найти следующий символ в целевой строке в исходной строке, начиная с текущей позиции в исходной строке. Если в какой-либо момент вы не можете найти символ в исходной строке, вывод должен быть «Нет», если нет, вывод должен быть «Да».

Ответ №1:

Как уже заявил Фабиан. У вас подход с подсчетом букв не получится. Вы никогда не будете освещать последовательность.

Вам нужно выбрать другой подход. Самый простой из них-использовать std::string существующую find функцию s.

Таким образом, вы пройдетесь по всем символам в данном наборе символов в правильной последовательности с помощью простого for цикла на основе диапазона. Затем вы можете использовать find функцию, чтобы проверить, существует ли символ в другой строке.

Чтобы обеспечить последовательность, вы должны искать не всегда с самого начала, а с последней позиции ( 1), в которой был найден символ. Это позволит сохранить последовательность.

Пример:

UMC UniverseCeeMake

  • Найдите букву «U», начиная с самого начала
  • «U» Найдено в позиции 0. Увеличьте начальную позицию до 1
  • Поиск «М», смотрящего с позиции 1
  • Буква «М» найдена в позиции 11 (уже за буквой «С»). Увеличьте начальную позицию до 12
  • Найдите букву «С» , начиная с позиции 12
  • Не удается найти —> Результатом будет «Нет».

Это может быть реализовано очень легко:

 #include <iostream>
#include <string>

bool canMakeStr(std::string toBeChecked, std::string characterSet) {

    // Result of function. We assume that it will work
    bool result{ true };

    // position, where we find a charcted in the string to be checked
    size_t position{};

    // Go through all characters from the given character set
    for (const char c : characterSet) {

        // Look, where this character has been found
        position = toBeChecked.find(c, position);

        // If we could not find the character in the string to be checked
        if (position == std::string::npos) {

            // Then the result is false
            result = false;
            break;
        }
        else {
            // Character was found. Now, we implement the solution to check for the sequence
            // We will not start to search again at the beginning, but after the just found character
            // This will ensure that we keep the sequence
              position;
        }
    }
    return resu<
}
int main()
{
    // Read the number of test cases
    unsigned int numberOfTestCases;  std::cin >> numberOfTestCases;

    // Work on all test cases
    while (numberOfTestCases--) {

        // Read the 2 strings
        std::string characterSet, toBeChecked;  std::cin >> characterSet >> toBeChecked;

        // And check for the result
        if (canMakeStr(toBeChecked, characterSet))
                std::cout << "Yesn";
            else
                std::cout << "Non";
    }
    return 0;
}