--------------题目大意------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目有多个测试数据,两行的数据为一组,读入两个字符串s1,s2,题目问的是s1如何通过栈的push和pop操作得到字符串s2,输出所有的进栈出栈方法,进栈 用'i'表示,出栈用’o'表示。例如:
Sample Input
madam adamm bahama bahama long short eric rice
Sample Output
[ 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 ] ---------题解思路-------------------------------------------------------------------------------------------------------------------------------- 简单说一下我的思路,方法可能不是很好 我用的是搜索的方法,两个指针p1,p2分别指向s1,s2,以及一个指针p指向栈stack[]的顶,接下来分为两种情况 当s1[p1]!=s2[p2] 只能进栈---搜索(p1+1,p2,p+1) 当s1[p1]==s2[p2] 可以直接出栈---搜索(p1,p2+1,p-1) 也可以接着进栈---搜索(p1+1,p2,p+1) 边界条件 p2==Lenth(s2) 表示完成,直接输出方案 剪枝条件 p==Lenth(s1)-1&&stack[p]!=s2[p2] 表示栈已满,但栈顶元素不等于出栈元素 ---------鄙人代码--------------------------------------------------------------------------------------------------------------------------------
#include<stdio.h> #include<stdlib.h> #include<string.h> char s1[100],s2[100],st[100],s[200]; int l,i=0; void go(char st[],int p1,int p2,int p); int main() { while(scanf("%s",s1)!=EOF) { scanf("%s",s2); st[0]=s1[0]; l=strlen(s1); s[0]='i'; printf("[\n"); go(st,0,0,0); printf("]\n"); } return 0; } void go(char st[],int p1,int p2,int p) { if(p==l-1&&st[p]!=s2[p2]) { return; } if(p2==l) { int j=0; for(j=0;j<=i;j++) printf("%c ",s[j]); printf("\n"); return; } if(st[p]!=s2[p2]) { if(p1<l-1) { st[p+1]=s1[p1+1]; i++;s[i]='i'; go(st,p1+1,p2,p+1); i--; } } else if(st[p]==s2[p2]) { if(p1<l-1) { st[p+1]=s1[p1+1]; i++;s[i]='i'; go(st,p1+1,p2,p+1); i--; } i++;s[i]='o'; go(st,p1,p2+1,p-1); i--; } }