本题并不是很难,就是输出所有能够目标WORD的可能。所以dfs+stack很容易解决。递归时有两种情况:

第一:两个字符不相等(即栈顶字符与目标字符不相等);这种情况很容易处理,将匹配word的下一个字符入栈,指针向后挪已为继续递归。

第二:两个字符相等(即栈顶字符与目标字符相等);这种情况有两种选择

      (1)字符出栈,并将目标word的指针向后挪一位,继续递归;

      (2)将匹配word的下一个字符入栈,指针向后挪一位,继续递归;

每一次递归用path记录下来路径。当目标word的指针超过最后一位了,说明成功,此时将path输出。

代码:

 

1 #include<stdio.h>
2 #include<string.h>
3 #include<stack>
4  using namespace std;
5  char str1[1005],str2[1005];int len1,len2;
6 char path[2005];
7 void test(int x,int y,stack<char> st,int t)
8 {
9 int j;
10 if(y==len2)
11 {
12 printf("i ");
13 for(j=0;j<t;j++)
14 printf("%c ",path[j]);
15 printf("\n");
16 return ;
17 }
18 if(st.empty ())
19 {
20 st.push(str1[x+1]);
21 path[t]='i';
22 test(x+1,y,st,t+1);
23 st.pop();
24 return ;
25 }
26 char cur=st.top ();
27 if(x==len1 && cur!=str2[y])
28 return ;
29 if(cur!=str2[y])
30 {
31 st.push(str1[x+1]);
32 path[t]='i';
33 test(x+1,y,st,t+1);
34 st.pop();
35 }
36 if(cur==str2[y])
37 {
38 st.push(str1[x+1]);
39 path[t]='i';
40 test(x+1,y,st,t+1);
41 st.pop();
42 st.pop();
43 path[t]='o';
44 test(x,y+1,st,t+1);
45 st.push(str1[x]);
46 }
47 return ;
48 }
49 int main()
50 {
51 int i,j;
52 while(scanf("%s%s",str1,str2)!=EOF)
53 {
54 len1=strlen(str1);
55 len2=strlen(str2);
56 printf("[\n");
57 if(len1<len2)
58 {
59 printf("]\n");
60 continue;
61 }
62 stack<char> st;
63 st.push(str1[0]);
64 test(0,0,st,0);
65 printf("]\n");
66 }
67 return 0;
68 }
69
70