您的位置:首页 > 其它

Code[VS] 1029 遍历问题

2015-02-23 13:36 274 查看
【题意】给定前序遍历和后序遍历(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: