2015-10-18 117 views
0

这是一个C++程序。 我们应该能够输入一个单词(长度从4到10个字母),然后生成n个单词的扰码(n是单词中的字母数)。显然,根据这些标准,只有两种不能被炒作的单词是每个字母相同的单词,以及除一个字母以外的每个字母都相同的单词(如OOOOA)。这两个例外的原因是,如果该单词由相同的字母组成,则该单词不存在争用,因为该单词的每个争用是相同的。另外,原始单词不算作争夺。所以,如果你有OOOOA然后只生成4争如何查看一个字符串是否包含多个不同的字母?

OOOAO OOAOO OAOOO 和AOOOO

时,它应该有5

对于大多数的5个字母的单词(如OOAAO)存在更多超过5个争议 - 但我的程序只需要生成5个。

在节目我已经创建的,告诉我,如果输入的字符串是由所有的字符相同的,所以我有第一种情况下照顾的功能。但是,我该如何编写一个函数,输入一个字符串,告诉我该字符串是否可以被加密。换句话说,功能应该告诉我,串

在其内具有至少有三个字符都是不同的,(如QRCCC,ORJJJ,QRTEW,等..)

包含字符混合,其中只有两个是相同的,在这种情况下,至少有两个不同的字符。 (如OOTTO,OTTOO,QRRQQ)

我对C++很新颖,所以请不要在这里引用我可能不了解的东西(比如冒泡排序,我可能知道这意味着什么,但如果我只是我知道是什么样子的代码,这样,除非它直接出现在代码中,请不要使用术语那样)

我不知道这里做什么。请指教。谢谢。

+1

我不明白你为什么不能争夺OOOOA。那么AOOOO会是什么? – Ant

+0

好吧,你看到OOOOA是5个字母长,并且任务说我必须创造X争夺单词,X是单词的长度 - 在这种情况下5.我认为我忘记提及的部分是原始单词不是争夺。 OOOOA将导致 OOOAO OOAOO OAOOO AOOOO 这只是4.这就是为什么它不起作用。 – JesW87

+1

'很明显,只有2种不能被炒的词......'为什么“很明显”? – deviantfan

回答

2

我想你正在寻找的是这样的:

#include<string> 
#include<algorithm> 
using namespace std; 

int main() 
{ 
    string word; 
    cin>>word; 
    int count=0; 
    std::sort(word.begin(), word.end()); 
    do 
    { 
     count++; 
    } 
    while (next_permutation(word.begin(), word.end())); 
    cout<<"Length is :"<<word.length()<<endl; 
    if(count>word.length()) 
    { 
     cout<<"No. of scrambles are >= length of word\n"; 
    } 
    else 
    { 
     cout<<"No. of scrambles are < length of word\n"; 
     return 0; 
    } 
    count=0; 
    std::sort(word.begin(), word.end()); 
    do 
    { 
     cout<<word<<"\n"; 
    } 
    while (next_permutation(word.begin(), word.end())); 
} 

在它检查由你输入的字符数的阶乘任何情况。重复的单词不会按照您的要求组合。

1

你的目标是基本检查:

  1. 至少有3种不同的字符。
  2. 2种物品,每个大于或在数量上等于2。

所以你基本上需要:

  1. 计数明显不同的字符。
  2. 统计每个字符的出现次数。

以下步骤:

  1. 创建一个字符串,接受字符串中的输入:

    string s; 
    cin>>s; 
    
  2. 创建26个元素的整数向量(因为在英文字母26个字母),初始化为0:

    vector<int> count(26,0); 
    

字符出现的3.To计数,实现这个代码:

for(int i=0;i<s.size();++i) 
    ++count[ s[i] - 'A' ]; //assuming all uppercase characters. 

现在你是“A的存储在count[0],数”数B的存储在count[1],等等。

  1. 声明一个计数器变量distinct,它计算向量中非零元素的个数。这会为您提供字符串中不同字符的数量。
  2. 声明一个flag变量,并将其初始化为false。迭代向量的每个元素,并检查向量的元素是否具有值1。如果你在矢量中遇到1,则制作flag = true;

你几乎已经达到了答案。你只需要检查以下条件来判断这个单词是否可以被加密:

bool can_be_scrambled = true; 
if(distinct == 1 || (distinct == 2 && flag == true)) 
    can_be_scrambled = false; 
+0

花了我一点时间去完成所有5个步骤。尼斯:) – anurag86

+0

是啊,谢谢!我不知道你的答案中使用的next_permutation函数,它看起来不错。但我猜它不会像这个那样高效,因为你提到它会运行(n!)次,n是字符串的大小。 –

+0

我猜即使我不确定next_permutation的内部实现,但AFAIK STL算法应该是最优化和高效的。我跑了_do while_两次,一次只是为了看看没有。乱七八糟的单词不仅仅是长度,而且还是第二次用于实际制作。它可能在第一个循环中包含一个检查,只运行_word.length_次数,使其更有效率。 – anurag86

相关问题