排列若干个字符串,判断是否首尾可以连接在一起
生活随笔
收集整理的這篇文章主要介紹了
排列若干个字符串,判断是否首尾可以连接在一起
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給出一個二維的字符串,即n行一列,如array[4][1] = {“def”,”abc”,”cmd”,”fkl”};取出每個字符串的首尾字符,進行判斷是否可以形成首尾相連,array數組中取出的分別為:“df”,”ac”,”cd”,”fl”,可以形成a->c->c->d->d->f->f->l,因此我們判斷得出結論上述輸入可以形成首尾相連.這里我們要注意的是從數組中取出首尾字符后要進行所有可能的排列,然后判斷是否可以形成首尾相連。
這里我們給出兩種方法,第一種利用STL中的相關函數實現
方法一:使用vector
//排列若干個字符串,檢查字符串是否收尾相接,若是返回1,否則返回-1 bool seriesarray(char** array,int row,int column) { using namespace std;bool result = false;if(array == NULL || row <= 0 || column <= 0)return result;//array[4][5]={"degf","abc","fgh","chd"};int num = row;//定義一個變量表示字符串的個數vector<char>v;//生成row*2個對象for (int i = 0;i < row;i++){//將每個字符串的第一個元素和最后一個元素插入到temp中v.push_back(array[i][0]);v.push_back(array[i][strlen(array[i])-1]); }vector<char>::iterator iter; //iterator 抽象了指針的絕大部分基本特征* printf("輸出每一個字符串的首尾字符: ");for( iter = v.begin(); iter != v.end(); iter++ ) printf("%c",*iter) ; printf("\n");vector<char>temp(v);vector<char>out;//結果放在out中out.reserve(row*2);out.push_back(v[0]);//array[0][0]///給out[0]和out[1]賦值out.push_back(v[1]);//array[0][strlen(array[0])-1]///vector<char>::iterator itor = temp.begin();temp.erase(temp.begin());temp.erase(temp.begin());//刪除前兩個字母num--;//判斷,一個字符串的頭是否是另外幾個的尾部,且頭部所在的為偶數(從0開始),尾部所在的下標為奇數//分成三部分,1.out[0],out[1]在頭部,即out[0]不是其余某一個字符的尾部,而out[1]是其余某一個的頭部;//2.out[0],out[1]在中部,out[0]是其余某一個的尾部,out[1]是其余某一個的頭部;//3.out[0],out[1]在尾部,out[0]是某一字符的尾部,out[1]是結束部分;while (num != 0){int flag = num;int i = 0;for ( i = 0;i < (int)temp.size()/2;i++){if (*out.rbegin() == temp[2*i])//以out[1]為開始,將其插入在out[1]的后面{out.push_back(temp[2*i]);out.push_back(temp[2*i+1]);int pre = temp[2*i];int after = temp[2*i+1]; //因為下面的erase操作會改變temp的大小,因此將其保存vector<char>::iterator del0 = find(temp.begin(),temp.end(),pre);if(del0 != temp.end())temp.erase(del0);vector<char>::iterator del1 = find(temp.begin(),temp.end(),after);if(del1 != temp.end())temp.erase(del1);num--;i = 0;}}for(i = 0;i < (int)temp.size()/2;i++){if (*out.begin() == temp[2*i+1])//以out[0]為開始,將其插入在out[0]的前面{out.insert(out.begin(),temp[2*i+1]);out.insert(out.begin(),temp[2*i]);int pre = temp[2*i];int after = temp[2*i+1];vector<char>::iterator del0 = find(temp.begin(),temp.end(),pre);if(del0 != temp.end())temp.erase(del0);vector<char>::iterator del1 = find(temp.begin(),temp.end(),after);if(del1 != temp.end())temp.erase(del1);num--;i = 0;}}if(flag == num){result = false;break;}}if (num == 0 && temp.empty() )result = true;return result; }方法二:使用暴力方法,比較笨拙
bool seriesarray(vector<string> &vec, int str_nums) {bool result = false;vector<int> com(str_nums,0);for (int i = 0; i < str_nums; i++)com[i] = i; //共str_num個字符串int facn = getfaci(str_nums); //共有facn這么多種組合,facn = str_nums!的階乘for (int i = 0; i < facn && !result;i++){int j = 1;for (; j < str_nums; j++){int pre_pos = com[j - 1];int cur_pos = com[j];if (vec[cur_pos][0] != vec[pre_pos][vec[pre_pos].size() - 1])break;}if (j == str_nums)result = true;next_permutation(com.begin(), com.end());//對com[]中的元素進行全排列}return result; }int getfaci(int n) {int result = 1;for (int i = 1; i <= n; i++)result *= i;return result; } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的排列若干个字符串,判断是否首尾可以连接在一起的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第一个出现一次的字符
- 下一篇: 字符串函数剖析