1143 字母转换

字母转换

时限: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 
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;
	}
}	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值