Anagrams by Stack


--------------题目大意------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

       题目有多个测试数据,两行的数据为一组,读入两个字符串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--;  
      }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值