2015-10-18 115 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

相關問題