基本上我遇到了2个子问题。 第一个问题是:给定2个字符串,确定它们是否是字谜。 第二是有点难。你有N个字符串,必须确定它们是否是彼此的字谜。
我已经解决了第一个,我将在下面编写代码,但对于第二个我不知道。我认为通过从字符串数组中读取N个字符串,然后使用for序列来读取每个字符串并比较它们,但我不知道如何准确地完成它是可能的。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string word1; string word2;
getline(cin,word1);
getline(cin,word2);
if(word1.length()==word2.length()){
sort(word1.begin(), word1.end());
sort(word2.begin(), word2.end());
if(word1==word2) cout<<"The words are anagrams of each other"<<endl;
else cout<<"The words are not anagrams of each other"<<endl;
}
else cout<<"The words are not the same length"<<endl;
return 0;
}
答案 0 :(得分:0)
查找两个字符串是否为字谜非常简单,尤其是对于ASCII字符集。最好的方法是创建一个大小为256的int数组。遍历第一个字符串和每个char ++ int。对第二个字符串执行相同的操作,并检查数组的结果是否相同。
将此扩展为多个字符串很容易,因为
a是b的字谜,b是c的字谜,然后a是c
的字谜
如果您使用更大的非ASCII字符集执行此操作,则最好使用散列映射而不是位集。
答案 1 :(得分:0)
如果X是Y和Z的字谜,则Y和Z也是字谜
所以,简单地重复你的逻辑,最简单的方法: -
std::vector<std::string> words; //Use a vector
size_t i;
std::string word1,word2;
//Get words from standard input
std::copy(std::istream_iterator<std::string> (std::cin),
std::istream_iterator<std::string>(),
std::back_inserter(words));
word1=words[0]; //Check anagram with first word
sort(word1.begin(), word1.end());
for(i=1; i<words.size();i++)
{
word2=words[i];
sort(word2.begin(), word2.end());
if(word2!=word1)
break;
}
if(i==words.size())
std::cout<<"All Anagrams !";