UVa 10340 All in All

判断s1是不是s2的字串    //这个字串不是连续字串

本来想迭代,不过循环不好处理

也没想到什么高效的算法

干脆递归了

每次从母串中的第n个位置查找字串中的下一个字符

查找到了递归处理下一个,直到母串or字串结束

母串结束时字串未结束return false

母串未结束字串结束了return true

要是没查到呢?

return false 

这时上一级不会直接return,而是continue查找

直到世界尽头(什么鬼

咳咳,是直到母串结束

递归就是简洁有木有

有木有

效率的话

是o(母串长度*字串长度)

还能接受

常系数就不要考虑了~~~


这题坑点之一是没有给串的限定长度

第一次RE

然后往大了开

然后TLE

我在循环里面用strlen,想想也是蛮拼的有没有

从循环里拿出来,就AC了

#include<cstdio>
#include<cstring>
using namespace std;

char big[100005];
char small[100005];

int s,b;

bool f(int n,int la){
    if(n==s)
        return true;
    for(int i=la;i<b;i++)
        if(big[i]==small[n] && f(n+1,i+1))
            return true;
    return false;
}

int main(){
    while(~scanf("%s %s",&small,&big)){
        s=strlen(small);
        b=strlen(big);
        printf("%s\n",f(0,0)?"Yes":"No");
    }
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值