Code[VS] 1029 遍历问题

来源:互联网 发布:公司域名备案需要多久 编辑:程序博客网 时间:2024/06/03 02:06
【题意】给定前序遍历和后序遍历(a-z且不重复),求中序遍历的方法数

【分析】
设前序遍历为s,后序遍历为t
设DFS(ls,rs,lt,rt)表示前序遍历为s[ls..rs],后序遍历区间为t[lt..rt]的方法数
若ls>=rs则肯定只有1种情况,返回1
由遍历的性质知道根节点=前序遍历的第一个=后序遍历的最后一个即s[ls]=t[rt],若不等于则返回0

找到wt使得t[wt]=s[ls+1],若wt=lt-1则返回DFS(ls+1,rs,lt,rt-1)<<1,

否则返回DFS(ls+1,ws,lt,wt)*DFS(ws+1,rs,wt+1,rt-1)


【实现】
#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;int len;char s[30],t[30];int DFS(int ls,int rs,int lt,int rt){if (s[ls]^t[rt]) return 0;if (ls>=rs) return 1;for (int ws=ls+1,wt=lt;;ws++,wt++)if (t[wt]==s[ls+1])return wt==rt-1?DFS(ls+1,rs,lt,rt-1)<<1:DFS(ls+1,ws,lt,wt)*DFS(ws+1,rs,wt+1,rt-1);}int main(void){ scanf("%s%s",s,t);len=strlen(s);printf("%d\n",DFS(0,len-1,0,len-1));return 0;}


0 0
原创粉丝点击