C++ 如何将一个单词拆分成字母并将其放入无序列表/集合?

C++ 如何将一个单词拆分成字母并将其放入无序列表/集合?,c++,C++,我正在尝试构建一个简单的字谜检查器,用于比较两个用户输入,并打印这对输入是否为字谜 我想这是一个很好的方法: -请求用户输入1和用户输入2 -将input1和input2拆分为单个字母 -将输入的1个字母放入无序集,将2个字母放入另一个无序集 -if(无序集1==无序集2) 这对是一个字谜 我不知道如何将输入拆分为单个字母,并将每个字母放入自己的无序列表/集合中 #include <iostream> int main() { std::cout << "H

我正在尝试构建一个简单的字谜检查器,用于比较两个用户输入,并打印这对输入是否为字谜

我想这是一个很好的方法:

-请求用户输入1和用户输入2

-将input1和input2拆分为单个字母

-将输入的1个字母放入无序集,将2个字母放入另一个无序集

-
if(无序集1==无序集2)
这对是一个字谜

我不知道如何将输入拆分为单个字母,并将每个字母放入自己的无序列表/集合中

#include <iostream>

int main()

{

    std::cout << "Hey there! enter a pair of words and tell you if they're an anagram or not." << endl;

    std::cout << "Enter first word: ";  
    std::string firstword{};
    std::cin >> firstword;

    std::cout << "Enter second word: ";
    std::string secondword{};
    std::cin >> secondword;

    //split firstword into letters
    //put letters into set1

    //split secondword into letters
    //put letters into set2

    //if (set1 == set2)
        //the pair is an anagram

    return 0;
}
#包括
int main()
{
std::cout二字;
//把第一个字分成几个字母
//将字母放入set1
//将第二个单词拆分为字母
//将字母放入set2
//if(set1==set2)
//这对是一个字谜
返回0;
}

您可以像遍历向量一样遍历字符串。元素只是字母(作为字符)

有几种方法可以做到这一点。我选择的方法是首先对每个字符串进行排序,遍历每个字符串,并将一个字符串的索引与另一个字符串的索引进行比较。在C++中,每个字符串由字符或字符组成,因此可以通过索引访问字符串的各个片段。
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    string firstWord;
    string secondWord;
    bool isAnagram;

    cout << "Hello! Enter the first word: ";
    cin >> firstWord;
    sort(firstWord.begin(), firstWord.end());

    cout << "Enter the second word: ";
    cin >> secondWord;
    sort(secondWord.begin(), secondWord.end());

    if(firstWord.length() == secondWord.length())
    {
        for(int i = 0; i < firstWord.length(); i++)
        {
            if(firstWord[i] == secondWord[i])
            {
                isAnagram = true;
            }
            else
            {
                isAnagram = false;
                break;
            }
        }
    }
    else
    {
        isAnagram = false;
    }

    if(isAnagram)
    {
        cout << "It's an anagram!\n";
    }
    else
    {
        cout << "It's not an anagram.\n";
    }

    return 0;
}
#包括
#包括
使用名称空间std;
int main()
{
字符串第一个字;
字符串第二个字;
布尔·伊萨纳格拉姆;
第一个字;
排序(firstWord.begin(),firstWord.end());
cout>secondWord;
排序(secondWord.begin(),secondWord.end());
if(firstWord.length()==secondWord.length())
{
for(int i=0;icout如果给定的单词是字谜,那么它们必须是同一字母集的s

#include <algorithm>

bool are_anagrams(const std::string& lhs, const std::string& rhs)
{
    if (lhs.size() != rhs.size())
    {
        return false;
    }

    return std::is_permutation(lhs.cbegin(), lhs.cend(), rhs.cbegin());
}

std::set
构造函数将一对迭代器作为参数,并使用它们来构造对象。

那些字符串、
firstword
secondword
已经是字母的集合。我倾向于将每个单词的字母按字母顺序排序,并检查生成的单词是否是同样,.Unordered set做了很多轮转,你不需要这么简单。你的想法不起作用,因为
Unordered_set{'a','b'}==Unordered_set{'a','a','b'}但是AB不是AAB的一个字谜。如果你不想对字符进行排序,你可以建立一个直方图,然后比较它。虽然它具有线性时间复杂度(相对于N.Logn进行排序),但实际上,在给定单词长度的情况下,它实际上是不太有效的。
“B”
彼此的字谜(当然假设为ASCII)。捕捉得很好。已编辑。请注意
if(firstWord.length()==secondWord.length())中的所有内容到它的代码>其他< /COD>子句可以被替换为<代码> iSaGAMRAM = FrasWord==二字;< /代码> +1。@ TuckerAlan感谢您的解决方案。作为C++新手,我花了几分钟来理解它,虽然我不理解排序函数所做的。所以这里有一个新手解释您的解决方案,这可能有助于O。登陆此页面的其他新手:请求一对单词作为用户输入。使用sort()重新排列字符(这里是字母)按升序。现在使用if语句来比较两个排序单词的长度。如果它们相等,则使用for循环来迭代每个字符并检查它们是否相同。正如@PeteBecker指出的,一种更简单的方法是完全避免for循环,并要求程序检查一个排序单词是否等于另一个排序单词。
std::string word = "foo";
auto start = word.cbegin();
auto end = word.cend();
std::set<char> letters{start, end};