問題描述:
- 拉姆剛剛開始學習英文字母,對單詞排序很感興趣,他能夠迅速確定是否可以將這些單詞排列在一個列表中,使得該列表中任何單詞的首字母與前一個單詞的尾字母相同,力能編寫一個計算機程序幫助拉姆進行判斷嗎?
- 函數canArrangeWords的輸入包含一個整數num和一個單詞arr。num表示列表中單詞的數目(1<=num<=100),而arr應包含只由’a’-‘z’組成的單詞(2<=arr中單詞長度<=100)
- 如果列表中的單詞可按照要求的方式排列,返回1;否則返回-1。在這種排列中,列表中的第一個單詞可以任意字母開頭,不需要滿足約束條件。
- 測試用例:
- TestCase 1:Input:4, [abcd,defg,ghij,jkl] Expected Return Value:1
- TestCase 2: Input: 4,[ghij,defg,jkl,abcd] Expected Return Value:-1
問題分析:
- 1.定義兩個變量,代表當前匹配通過的start和end
- 2.對於下一個word來說,有可能是首尾匹配,也有可能是尾首匹配,分別更新start和end即可。
- 3.如果下一個word跟當前不匹配,我們把當且word放入容器的尾部(因為可能會在后面完成匹配)
- 4.如此循環,所有都匹配成功,或者匹配和不匹配的單詞總數超過單詞總數
- 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 }