Я не хочу, чтобы символ "a" сравнивался более одного раза, если он уже соответствует сравнению строк С++ [закрыто]

avatar
Davidson Cassagnol
8 августа 2021 в 21:37
71
2
-2

У меня есть две строки:

string alphabet = "abcdefghijklmnopqrstuvwxyz";
string input = "abc";

Вы видите, что после выполнения цикла i первый символ abc_letters равен 'a', по сравнению с символом цикла j input_letter после его выполнения, который также является '<84003722>, матч. Этот символ сохраняется в строке matched, что мне и нужно.

Теперь проблема заключается в том, что при втором выполнении цикла j abc_letters остается 'a', а input_letter становится <20008728744378>, символы не совпадают и <294037 > сохраняется в строке missing, но 'b' является символом в строке input, он просто не соответствует символу 'a'.

Мне нужен цикл i, чтобы перейти к следующему символу после совпадения буквы. Другими словами, символ abc_letters 'a' является совпадением и сохраняется в строке matched, цикл i должен двигаться дальше, и abc_letters становится 'b'. Если один символ уже совпал, я хочу, чтобы программа пропустила его, а не сравнила с другими символами в строке input, это явно не будет совпадением!

Я не хочу, чтобы символ 'a' сравнивался более одного раза и сохранялся как в строках missing, так и в строках matched, если он уже совпал.

Пожалуйста, помогите мне изменить этот код на C++!

string listMissingLetters(string input)
{
    string missing = "";  
    string matched = "";
    string alphabet = "abcdefghijklmnopqrstuvwxyz";
   
    bool letter_matched= true;//letters matched true or faulse 
    for (int i = 0; i < alphabet.length(); i++) 
    {
        letter_matched = true;
       char abc_letter = alphabet[i];//assigning the first character of the loops to the varible abc_letters
        for (int j = 0; j < input.length(); j++) //nested loop for the user input string sorting through input string
        {
            char input_letter = input[j];//assigning the first character of the the input string to the varible input_letters
            if (abc_letter == input_letter) 
            {
                letter_matched = true;
                matched += abc_letter;
               
            }
            else if (abc_letter != input_letter)
            { 
                letter_matched = false;
                missing += abc_letter;
            }   
                   
        }     
    } 
    return missing;
}
Источник
cigien
8 августа 2021 в 21:41
0

Ваше описание мне не очень понятно. Попробуйте немного пояснить, а еще лучше было бы, если бы вы показали несколько примеров ввода-вывода для функции.

rturrado
8 августа 2021 в 21:48
0

1) Вы хотите проверить, все ли буквы во входной строке являются буквами алфавита? Тогда вам не нужен внешний цикл; просто пройдитесь по входной строке и проверьте, есть ли каждая буква в строке алфавита. Или 2) вы хотите проверить, является ли входная строка подстрокой строки алфавита? Тогда вы закончите использовать substr.

Ответы (2)

avatar
Remy Lebeau
8 августа 2021 в 21:59
1

Как только вы найдете совпадение, вам нужно break выполнить цикл j, чтобы затем вы могли continue выполнить цикл i.

Попробуйте еще что-нибудь вроде этого:

string listMissingLetters(string input)
{
    string missing, matched;
    const string alphabet = "abcdefghijklmnopqrstuvwxyz";   

    for (size_t i = 0; i < alphabet.length(); ++i) 
    {
        bool letter_matched = false;
        char abc_letter = alphabet[i];

        for (int j = 0; j < input.length(); ++j)
        {
            char input_letter = input[j];
            if (abc_letter == input_letter) 
            {
                letter_matched = true;
                matched += abc_letter;
                break;               
            }
        }

        if (!letter_matched)
            missing += abc_letter;
    } 

    return missing;
}

Что можно еще больше упростить, если заменить весь цикл j на std::string::find(), например:

.
string listMissingLetters(string input)
{
    string missing, matched;
    const string alphabet = "abcdefghijklmnopqrstuvwxyz";   

    for (size_t i = 0; i < alphabet.length(); ++i) 
    {
        char abc_letter = alphabet[i];
        if (input.find(abc_letter) != string::npos)
            matched += abc_letter;
        else
            missing += abc_letter;
    } 

    return missing;
}

Что затем можно упростить, если вы избавитесь от matched и alphabet, так как они вам на самом деле не нужны, например:

string listMissingLetters(string input)
{
    string missing;

    for (char abc_letter = 'a'; abc_letter <= 'z'; ++abc_letter) 
    {
        if (input.find(abc_letter) == string::npos)
            missing += abc_letter;
    } 

    return missing;
}

При этом существуют и другие способы реализации этой задачи с использованием стандартных алгоритмов, чтобы вам не приходилось искать недостающие символы вручную, например:

#include <algorithm>

string listMissingLetters(string input)
{
    string alphabet = "abcdefghijklmnopqrstuvwxyz";

    alphabet.erase(
        std::remove_if(alphabet.begin(), alphabet.end(),
            [&](char ch){ return (input.find(ch) != string::npos); }
        ),
        alphabet.end()
    );

    return alphabet;
}
#include <algorithm>
#include <iterator>

string listMissingLetters(string input)
{
    const string alphabet = "abcdefghijklmnopqrstuvwxyz";
    string missing;

    sort(input.begin(), input.end());
    set_difference(alphabet.begin(), alphabet.end(), input.begin(), input.end(), back_inserter(missing));

    return missing;
}

Онлайн-демонстрация

Davidson Cassagnol
9 августа 2021 в 02:26
0

спасибо, первый пример кода был тем, что я искал, можете ли вы объяснить мне эту строку "if (!letter_matched) отсутствует += abc_letter;", а также как мне сделать этот регистр чувствительным, чтобы разрешить заглавную букву. упрощая код первого примера и еще раз спасибо, я работал над этим дольше всех!

Remy Lebeau
9 августа 2021 в 05:47
0

@DavidsonCassagnol "можете ли вы объяснить мне эту строку" - правда? Что в нем непонятно? Я думаю, что это должно быть очень понятно. letter_matched является ложным, если цикл j не находит совпадения. Если совпадений не найдено, то добавляется missing. Возможно, вы спрашиваете, как работает operator!? "как мне сделать этот регистр чувствительным" - это уже так. Может быть, вы имели в виду регистр-inс учетом регистра? Добавьте заглавные буквы в строку alphabet, в противном случае используйте strncmpi() или аналогичную функцию для сравнения.

avatar
GoldenAxe
8 августа 2021 в 21:58
0

Если вы хотите, чтобы ваш код проверял соответствие каждого символа алфавита любому символу во "вводе" и помечал его как отсутствующий только в том случае, если символ алфавита вообще не встречается во "вводе", вам необходимо изменить код бит:

letter_matched = false;
char abc_letter = alphabet[i];       
for (int j = 0; j < input.length(); j++)
{
    char input_letter = input[j];
    if (abc_letter == input_letter) 
    {
         letter_matched = true;
         matched += abc_letter;
         break;
    }
}     
if( !letter_matched )
    missing += abc_letter;