打印可以用两个字符串形成的字符串

时间:2016-05-24 10:59:13

标签: string algorithm data-structures

我正在尝试解决以下问题。但无法提出正确的解决方案

给出两个字符串xyzabc。找到可以用这两个字符串形成的所有字符串。一个限制是每个字符串中的字符序列应保持不变。

示例:

xyabzc - Valid

xabcyz - Valid

abcxyz - Valid

xyzacb - Invalid. (b cannot come before c)

我尝试了以下内容,

将两个字符串连接成一个新字符串。获得字符串的所有排列并删除不遵循上述约束的那些。我知道这很模糊,但这是我提出的唯一解决方案。

请建议更好的方法。

1 个答案:

答案 0 :(得分:8)

您可以使用递归轻松解决此问题。在每个步骤中,您可以添加第一个字符串中的字符或第二个字符串中的字符。

C ++代码 -

#include <iostream>
#include <string>
#include <vector>

using namespace std;

string s1, s2;  //Input strings
vector <string> v;  //To store resultant strings

void merge_strings(int i,int j,string res)
{
        if(i == s1.length() && j == s2.length())
                v.push_back(res);
        if(i < s1.length())
                merge_strings(i + 1,j,res + s1[i]);
        if(j < s2.length())
                merge_strings(i,j + 1,res + s2[j]);
}

int main()
{
        s1 = "abc";
        s2 = "xyz";
        merge_strings(0,0,"");
        for(string s : v)
                cout << s << endl;
        return 0;
}

输出 -

abcxyz
abxcyz
abxycz
abxyzc
axbcyz
axbycz
axbyzc
axybcz
axybzc
axyzbc
xabcyz
xabycz
xabyzc
xaybcz
xaybzc
xayzbc
xyabcz
xyabzc
xyazbc
xyzabc