洛谷 p1030 求先序排列
这个题做了快半上午
实际上只是一道普及-(因为我太蒻了)
我不太理解递归啊,我实在太蒻了,于是就开始做了这道题
一开始数组越界,蜜汁RE
吐槽结束
思路大家应该都明白吧
找后序遍历的最后一个,去中序遍历找到,然后左右二分,就这么简单
#include<bits/stdc++.h>
using namespace std;
string a,b;
void sg(int a1,int a2,int b1,int b2){//a1,b1是两个遍历的起点,a2,b2是终点
cout<<b[b2];//输出后序遍历最后一个
int x;//x记录中序遍历中后序最后一个的位置
for (int i = a1; i <= a2; ++i)//好像也可以用什么什么"邦德",咱也不会读,咱也不会拼,我这种蒟蒻怎么会这种东西
if(a[i] == b[b2]){
x = i;
break;
}
if(a1 <= x - 1 && b1 <= b1 + x - 1 - a1)//越界就不递归
sg(a1,x - 1,b1,b1 + x - 1 - a1);//左边,为什么这样拿样例自己分一下就知道了
if(x + 1 <= a2 && b1 + x - a1 <= b2 - 1)
sg(x + 1,a2,b1 + x - a1,b2 - 1);//右边
}
int main(int argc, char const *argv[])
{
cin>>a>>b;
int lea,leb;
lea = a.length() - 1;
leb = b.length() - 1;
sg(0,lea,0,leb);//起始长度
return 0;
}//下面是一组自己的数据,正确答案是125763i89,大家可以写完之后测试一下
//75261i389
//7562i9831
作者: liuzitong
出处:http://www.cnblogs.com/lztzs/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。