字母转换
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
通过栈交换字母顺序。给定两个字符串,要求所有的进栈和出栈序列(i表示进栈,o表示出栈),使得字符串2在求得的进出栈序列的操作下,变成字符串1。输出结果需满足字典序。例如TROT 到 TORT:
[
i i i i o o o o
i o i i o o i o
]
[
i i i i o o o o
i o i i o o i o
]
输入
给定两个字符串,第一个字符串是源字符串,第二个字符是目标目标字符串。
输出
所有的进栈和出栈序列,输出结果需满足字典序
输入样例
madam adamm bahama bahama long short eric rice
输出样例
[
i i i i o o o i o o
i i i i o o o o i o
i i o i o i o i o o
i i o i o i o o i o
]
[
o i i i o o i i o o o i
o i i i o o o i o i o i
o i o i o i i i o o o i
o i o i o i o i o i o i
]
[
]
[
i i o i o i o o
]
#include<iostream>
#include<stack>
#include<stdio.h>
#include<string.h>
using namespace std;
char str1[100],str2[100];
int rs[50];
int num1,num2;
stack<char>s;
int search(int m);
int test();
void output();
int main()
{
while(scanf("%s",&str1) != EOF)
{
scanf("%s",&str2); //输入两个字符串
num1 = strlen(str1);
num2 = strlen(str2); //计算两字符串长度
while(!s.empty())
{
s.pop() ;
}
if(num1 != num2)
{
cout<<"["<<endl<<"]"<<endl;;
}
else
{
cout<<"["<<endl;
search(0);
cout<<"]"<<endl;
}
}
return 0;
}
int search(int m)
{
int i;
if(m == 2*num1) //递归结束
{
if(test())
{
output();
}
}
else
{
for(i = 1;i >= 0;i--)
{
rs[m] = i;
search(m+1);
}
}
}
int test()
{
int i,j = 0,k = 0,flag = 1,sum = 0;
char temp[100];
for(i = 0;i<2*num1;i++)
{
sum=sum+rs[i];
}
if(sum!=num1)
{
flag = 0;
}
for(i = 0;i < 2*num1;i++)
{
if(rs[i] == 1)
{
s.push(str1[j]);
j++;
}
if(rs[i] == 0)
{
if(j>k)
{
temp[k] = s.top();
s.pop();
k++;
}
else
{
flag = 0;
break;
}
}
}
for(k=0;k<num1;k++)
{
if(temp[k] != str2[k])
{
flag = 0;
break;
}
}
return(flag);
}
void output()
{
int i ;
for(i = 0;i < 2*num1-1;i++)
{
if(rs[i] == 1)
{
cout<<"i ";
}
else
{
cout<<"o ";
}
}
if(rs[2*num1] == 1)
{
cout<<"i"<<endl;
}
else
{
cout<<"o"<<endl;
}
}