字母转换

时限: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
]
 
输入
给定两个字符串,第一个字符串是源字符串,第二个字符是目标目标字符串。
 
输出
所有的进栈和出栈序列,输出结果需满足字典序
 
输入样例
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 ] [ i 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 o i o i o o ]



#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stack>
using namespace std;


int search(int n);
int qiuhe();
int check();


char str1[100],str2[100],str3[30];
int a[30];
int num1,num2,flag=0;
stack<char>s;




int main()
{
while(scanf("%s",&str1) != EOF)
{
scanf("%s",&str2);

num1=strlen(str1);
num2=strlen(str2);
while(!s.empty())
{
s.pop();
}

if(num1!=num2)
{
printf("[\n]\n");
}
else
{
printf("[\n");
search(0);
printf("]\n");
}
}


return 0;







int search(int n)
{
int i;
if(n==2*num1)
{
if(qiuhe())
{
if(check())
{
for(i=0; i<2*num1-1; i++)
{
if(a[i]==0)
{
printf("i ");
}
else
{
printf("o ");
}
}
if(a[2*num1-1]==0)
{
printf("i");
}
else
{
printf("o");

printf("\n");
}
}
}
else
{
for(i=0; i<2; i++)
{
a[n]=i;
search(n+1);
}
}
}


int qiuhe()
{
int i,sum=0;
for(i=0; i<2*num1; i++)
{
sum=sum+a[i];
}
if(sum!=num1)
{
return 0;
}
return 1;
}




int check()
{
int i,j=0,k=0;
for(i=0; i<2*num1; i++)
{
if(a[i]==0)
{
s.push(str1[j]);
j++;
}
if(a[i]==1)
{
if(j>k)
{
str3[k]=s.top();
s.pop();
k++;
}
else
{
return 0;
}
}
}
for(i=0; i<num1; i++)
{
if(str3[i]!=str2[i])
{
return 0;
}
}
return 1;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值