P1827 [USACO3.4]美国血统 American Heritage
输入
ABEDFCHG
CBADEFGH
输出
AEFDBHGC
思路:根据先序和中序推后序,一共有两种方法:1.参数为字符串和 2.参数为字符串的起始下标.
参考代码
#include<bits/stdc++.h>
using namespace std;
string preorder, inorder;
void solve1(string pre, string in) {
int index = in.find(pre[0]);
if (pre == "") {//递归结束条件
return;
}
solve1(pre.substr(1, index), in.substr(0, index));
solve1(pre.substr(index + 1), in.substr(index + 1));
cout << pre[0];
}
void solve2(int pre,int mid,int len){//前序、中序起始索引, 长度 此方法效率更高,推荐
if(len <= 0){
return;
}
int index = inorder.find(preorder[pre])-mid;//长度
solve2(pre+1,mid,index);
solve2(pre+1+index,mid+index+1,len-index-1);
cout<<preorder[pre];
}
int main()
{
cin >> inorder>>preorder;
//solve1(preorder, inorder);
solve2(0,0,preorder.size());
cout<<endl;
return 0;
}
BADC
BDCA
输出
ABCD
思路:根据中序和后序推先序,很基础的题.有两种方法,这里上效率高的那种.
参考代码
#include<bits/stdc++.h>
using namespace std;
string midorder,postorder;
void solve(int mid,int post,int len){
if(len == 0){
return;
}
cout<<postorder[post+len-1];
int index = midorder.find(postorder[post+len-1])-mid;
solve(mid,post,index);
solve(mid+index+1,post+index,len-index-1);
}
int main()
{
cin>>midorder>>postorder;
solve(0,0,midorder.size());
return 0;
}