【问题标题】:I don't want the character "a" to be compared more than once if its already matched string comparison C++ [closed]如果字符“a”已经匹配的字符串比较C++,我不希望它被多次比较[关闭]
【发布时间】:2021-10-12 17:27:43
【问题描述】:

我有两个字符串:

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

你看i循环执行后,abc_letters的第一个字符是'a',与j循环字符input_letter相比,它执行后也是'a',即一场比赛。该字符被存储到matched 字符串中,这正是我想要的。

现在,我遇到的问题是,通过第二次执行 j 循环,abc_letters 仍然是 'a'input_letter 变为 'b',字符不匹配和 @987654334 @ 存储在missing 字符串中,但'b'input 字符串中的一个字符,它与字符'a' 不匹配。

我需要i 循环在匹配一个字母后移动到下一个字符。换句话说,abc_letters'a' 字符是匹配的,它被存储到matched 字符串中,i 循环应该继续,abc_letters 变为'b'。如果一个字符已经匹配,我希望程序跳过它,而不是将它与input 字符串中的其他字符进行比较,这显然不会匹配!

我不希望字符 'a' 被多次比较并存储在 missingmatched 字符串中(如果它已经匹配)。

请帮我用 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;
}

【问题讨论】:

  • 你的描述对我来说不是很清楚。试着澄清一下,如果你展示一些函数的输入输出示例会更好。
  • 1) 您想检查输入字符串中的所有字母是否都是字母吗?那么你就不需要外循环了;只需遍历您的输入字符串并检查每个字母是否在字母字符串中。或者2)你想检查输入字符串是否是字母字符串的子字符串?然后你就可以使用substr了。

标签: c++ arrays string for-loop visual-c++


【解决方案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;
}

如果您摆脱 matchedalphabet,则可以进一步简化,因为您并不真正需要它们,例如:

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

Online Demo

【讨论】:

  • 谢谢第一个示例代码是我要找的,你能帮我解释一下这行“如果 (!letter_matched) 缺少 += abc_letter;”我将如何让这个区分大小写允许大写字母。简化第一个示例代码,再次感谢您,我一直在努力!
  • @DavidsonCassagnol "你能为我解释一下这条线" - 真的吗?有什么不清楚的地方?我认为这应该是不言自明的。 letter_matched 为 false,除非 j 循环找到匹配项。如果未找到匹配项,则附加 missing。你可能会问operator! 是如何工作的? “我将如何使这个区分大小写” - 它已经是。也许您的意思是区分大小写?在alphabet 字符串中添加大写字母,否则使用strncmpi() 或等效函数进行比较。
【解决方案2】:

如果您希望您的代码检查每个字母字符是否与“输入”中的任何字符匹配,并且仅当字母字符根本不出现在“输入”中时才将其标记为缺失,那么您需要修改您的代码位:

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;

【讨论】:

    猜你喜欢
    • 2011-03-27
    • 2021-02-04
    • 2022-03-30
    • 2013-02-19
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多