标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1513 Accepted Submission(s): 690
[
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
]
[
i 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 o i o i o o
]
非常有意思的题目,栈模拟,通过栈模拟,将ts1实现ts2,题目要求字典序,i<o,所以只要尽量进栈优先就可以了
本题还要注意一个问题,栈最后可能不为空,考虑ts1="abcde" ts2="bcde" 最后‘a‘还留在栈中,所以最好要清空栈,写的时候没想到,现在写题解突然想到原因了...
这题值得以后重复研究,挺经典的样子,好久没做这种存dfs的题目了,能想到一半,但是自己不看题解能难理清思绪,题解在代码里
/*programming ts1全部入栈,栈顶元素和ts2的指针指向的元素比较,如果不匹配,栈顶元素弹出,即ts1的指针前移,继续栈顶匹配, 直到ts1的某个元素和ts2匹配,栈顶元素出栈,ts2的指针后移,原来出栈的元素继续入栈,重复此过程,如果ts2的元素被匹配完全,说明可行,输出记录的过程way 因为最后一步操作是出栈,所以输出的时候,出栈完之后要重新入栈 */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <stack> #include <queue> #include <string> const int inf = (1<<31)-1; const int MAXN = 1e4; using namespace std; stack<char>ms; char ts1[MAXN]; char ts2[MAXN]; int len1,len2; char way[2*MAXN]; void dfs(int i,int j,int k){ if(j==len2){ for(int l=0;l<k;l++){ cout<<way[l]<<" "; } cout<<endl; return ; } if(i!=len1){ ms.push(ts1[i]); way[k] = ‘i‘; dfs(i+1,j,k+1); ms.pop();//回溯出栈,总出口 } if(!ms.empty()){ if(ms.top()==ts2[j]){ way[k] =‘o‘; ms.pop(); dfs(i,j+1,k+1); ms.push(ts2[j]);//输出完之后回溯进栈 } } } int main() { while(scanf("%s%s",ts1,ts2)!=EOF){ len1 = strlen(ts1); len2 = strlen(ts2); cout<<"["<<endl; dfs(0,0,0); cout<<"]"<<endl; } //cout << "Hello world!" << endl; return 0; }
标签:
原文地址:http://www.cnblogs.com/EdsonLin/p/5440238.html