排列若干個字串,判斷是否首尾可以連線在一起
阿新 • • 發佈:2019-01-30
給出一個二維的字串,即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;
}