1198. Substring
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
Dr lee cuts a string S into N pieces,s[1],…,s[N].
Now, Dr lee gives you these N sub-strings: s[1],…s[N]. There might be several possibilities that the string S could be. For example, if Dr. lee gives you three sub-strings {“a”,“ab”,”ac”}, the string S could be “aabac”,”aacab”,”abaac”,…
Your task is to output the lexicographically smallest S.
Input
The first line of the input is a positive integer T. T is the number of the test cases followed.The first line of each test case is a positive integer N (1 <=N<= 8 ) which represents the number of sub-strings. After that, N lines followed. The i-th line is the i-th sub-string s[i]. Assume that the length of each sub-string is positive and less than 100.
Output
The output of each test is the lexicographically smallest S. No redundant spaces are needed.
Sample Input
1
3
a
ab
ac
Sample Output
aabac
————————————————————————————————————————————————
问题简述:
分别输入N(N<8)个子字符串str[],随意排列组合,输出所有组合串中字典序最小的字符串。
涉及算法:
递归,排序
思路:
-------先想到的方法是对所有子字符串string str[i]按照字典序排序,然后按顺序组合就好了
结果:wrong answer
原因:没有考虑到这种情况:
1
2
b
ba
这种输入,按照题目要求的标准输出应该是:bab,
但是如果按照我自己的方法就会输出bba(b的字典序<ba,但是bab的字典序<bba)
改进思路:
------------先得到子字符串的所有排列组合结果,然后将结果按字典序排序,输出字典序最小的字符串。
得到所有排列组合结果的方法是递归算法,同时在递归时就比较字典序的大小。
代码:
</pre><pre name="code" class="cpp">#include <iostream>
#include <string>
using namespace std;
void Permutation_Solution(string sub[], string *hold, int begin, int end)
{
if(begin == end - 1) //只剩一个元素
{
string str;
for(int i = 0; i < end; i++)
str += sub[i];
if(str < *hold)
*hold = str;
}
else
{
for(int k = begin; k < end; k++)
{
swap(sub[k], sub[begin]); //交换两个字符串的位置
Permutation_Solution(sub, hold, begin + 1, end);//递归
swap(sub[k],sub[begin]); //恢复
}
}
}
int main() {
int n = 0;
cin >> n;
while(n >0) {
int num;
cin >> num;
string sub[num]; //子串
string hold;
for(int i = 0; i < num; i++){
cin >> sub[i];
hold += sub[i];
}
Permutation_Solution(sub, &hold, 0, num);
cout << hold << '\n';
n--;
}
return 0;
}