如何查看字符串是否包含多个不同的字母?

时间:2015-10-18 02:21:45

标签: c++ string char

这适用于C ++程序。 我们应该能够输入一个单词(长度为4到10个字母),然后生成单词的n个加扰(n是单词中的字母数)。显然,在这些标准下不能加扰的唯一两种词是每个字母相同的词,以及除了一个字母之外的每个字母都是相同的词(如OOOOA)。这两个例外的原因是,如果单词由相同的字母组成,那么单词的扰乱就没有了,因为单词的每个争夺都是相同的。此外,原始单词不算作争夺。所以如果你有OOOOA那么它只生成4个争夺

OOOAO OOAOO OAOOO 和AOOOO

什么时候应该有5。

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

在程序中我已经创建了一个函数,告诉我输入的字符串是否由所有相同的字符组成,所以我有第一个案例需要处理。但是,我应该如何编写一个输入字符串的函数,告诉我该字符串是否可以加扰。换句话说,函数应该告诉我字符串

其中至少有三个字符都是不同的(如QRCCC,ORJJJ,QRTEW等)。

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

我对C ++很陌生,所以请不要引用我此时可能不理解的内容(比如冒泡排序。我可能知道这意味着什么,但如果我这样做,我只会知道它在代码中的含义所以请不要使用这样的术语,除非它直接出现在代码中)

我不知道该怎么做。请指教。感谢。

2 个答案:

答案 0 :(得分: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)

您的目标基本上是检查:

  1. 至少有3种不同的字符。
  2. 2种项目,每项大于或等于2。
  3. 所以你基本上需要:

    1. 计算不同字符的数量。
    2. 计算每个角色的出现次数。
    3. 按照以下步骤操作:

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

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

        vector<int> count(26,0);
        
      3. 3.要计算一个字符的出现次数,请执行以下代码:

        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;
        3. 你几乎已经达到了答案。您只需要检查以下条件,以判断该单词是否可以加扰:

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