C++ 單詞接龍

問題描述:web

  1. 拉姆剛剛開始學習英文字母,對單詞排序很感興趣,他可以迅速肯定是否能夠將這些單詞排列在一個列表中,使得該列表中任何單詞的首字母與前一個單詞的尾字母相同,力能編寫一個計算機程序幫助拉姆進行判斷嗎?  
  2.   
  3. 函數canArrangeWords的輸入包含一個整數num和一個單詞arr。num表示列表中單詞的數目(1<=num<=100),而arr應包含只由’a’-‘z’組成的單詞(2<=arr中單詞長度<=100)  
  4.   
  5. 若是列表中的單詞可按照要求的方式排列,返回1;不然返回-1。在這種排列中,列表中的第一個單詞能夠任意字母開頭,不須要知足約束條件。  
  6.   
  7. 測試用例:   
  8. TestCase 1:Input:4, [abcd,defg,ghij,jkl] Expected Return Value:1   
  9. TestCase 2: Input: 4,[ghij,defg,jkl,abcd] Expected Return Value:-1 

問題分析:數據結構

  1. 1.定義兩個變量,表明當前匹配經過的start和end   
  2. 2.對於下一個word來講,有多是首尾匹配,也有多是尾首匹配,分別更新start和end便可。   
  3. 3.若是下一個word跟當前不匹配,咱們把當且word放入容器的尾部(由於可能會在後面完成匹配)   
  4. 4.如此循環,全部都匹配成功,或者匹配和不匹配的單詞總數超過單詞總數   
  5. 5.根據上述1-4步驟,很容易聯想到用隊列做爲數據結構。
     1 using namespace std;
     2 int canArrangeWords(int num,char** arr){
     3 if(num<1||num>100)
     4 return -1;
     5 queue<string> qs;
     6 for(int i=0;i<num;i++)
     7 {
     8 qs.push(arr[i]);
     9 int len=strlen(arr[i]);
    10 if(len<2||len>100)
    11 return -1;
    12 }
    13 int count=1;
    14 int countr=0;
    15 char head=qs.front().at(0);
    16 char end=qs.front().at(strlen(arr[0]-1);
    17 qs.pop();
    18 while(!qs.empty()&&(count+countr<=num))
    19 {
    20 int len=strlen(qs.front().c_str());
    21 if(qs.front().at(0)==end)
    22 {
    23 end=qs.front().at(len-1);
    24 qs.pop();
    25 count++;
    26 }
    27 else if(qs.front().at(len-1)==head)
    28 {
    29 head=qs.front().at(0);
    30 qs.pop();
    31 count++;
    32 }
    33 else
    34 {
    35 qs.push(qs.front());
    36 qs.pop();
    37 countr++;
    38 }
    39 }
    40 if(count==num)
    41 return 1;
    42 return -1;
    43 }
相關文章
相關標籤/搜索