hdu 1515 Anagrams by Stack

题解:

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

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

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

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

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

#include<stdio.h>
#include<string.h>
#include<stack>
using namespace std;
char str1[1005],str2[1005];
int len1,len2;
char path[2005];
void test(int x,int y,stack<char> st,int t)
{
    int j;

    if(y==len2)
    {
        printf("i ");
        for(j=0; j<t; j++)
            printf("%c ",path[j]);
        printf("\n");
        return ;
    }
    if(st.empty ())
    {
        st.push(str1[x+1]);
        path[t]='i';
        test(x+1,y,st,t+1);
        st.pop();
        return ;
    }
    char cur=st.top ();
    if(x==len1 && cur!=str2[y])
        return ;

    st.push(str1[x+1]);
    path[t]='i';
    test(x+1,y,st,t+1);
    st.pop();

    if(cur==str2[y])
    {
        st.pop();
        path[t]='o';
        test(x,y+1,st,t+1);
        st.push(str1[x]);
    }
    return ;
}
int main()
{
    int i,j;
    while(scanf("%s%s",str1,str2)!=EOF)
    {
        len1=strlen(str1);
        len2=strlen(str2);
        printf("[\n");
        if(len1<len2)
        {
            printf("]\n");
            continue;
        }
        stack<char> st;
        st.push(str1[0]);
        test(0,0,st,0);
        printf("]\n");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/XDJjy/p/3349611.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值