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