sicily1198

来源:互联网 发布:算法类问题求解的步骤 编辑:程序博客网 时间:2024/04/20 10:10

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

13aabac

Sample Output

aabac


————————————————————————————————————————————————

问题简述:

分别输入N(N<8)个子字符串str[],随意排列组合,输出所有组合串中字典序最小的字符串。

涉及算法:

递归,排序

思路:

-------先想到的方法是对所有子字符串string str[i]按照字典序排序,然后按顺序组合就好了

结果:wrong answer

原因:没有考虑到这种情况:

INPUT

12bba
这种输入,按照题目要求的标准输出应该是: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;}











0 0
原创粉丝点击