两种方法实现Strstr判断

方法一:正面考虑

即用计数器j看每个子串是否全部都与给定的str相等,相等则为子串,不等则不是。

class Solution {
public:
    int strStr(string haystack, string needle) {
        //考虑两个特殊情况:1.当needle为空串 2.当Str长度小于str。
    int len1= haystack.size();
    int len2=needle.size();
    if(len2==0)return 0;
    if(len1<len2)return -1;
       //这里相当于从头到尾将Str分割成了若干个相同长度的子串。然后逐一判断,Str中是否存在该str子串。
    for(int i=0;i<=len1-len2;i++){
        if(haystack[i]==needle[0]){
            int j=0;
            //一定要考虑j是否越界!!!否则只能加个大括号每次都判断if语句了。
                while((j<len2)&&(haystack[i+j]==needle[j]))
                j++;
                if(j==len2)
                return i;
        }
    }
    return -1;
}
};

方法二:反面考虑

所谓反面考虑就是遍历的每个子串一旦不与str相等,则跳出遍历下一个子串。

class Solution {
public:
    int strStr(string haystack, string needle) {
        //考虑两个特殊情况:1.当needle为空串 2.当Str长度小于str。
    int len1= haystack.size();
    int len2=needle.size();
    if(len2==0)return 0;
    if(len1<len2)return -1;
       //这里相当于从头到尾将Str分割成了若干个相同长度的子串。然后逐一判断,Str中是否存在该str子串。
    for(int i=0;i<=len1-len2;i++){
        if(haystack[i]==needle[0]){
            int j=0;
//与上一个方法就多加了一个flag用来标记,注意每次flag进行下一次子串判断的时候重新置1.
           int flag = 1;
                while(j<len2){
               if(haystack[i+j]!=needle[j++]){
                    flag = 0;
                    break;
                }
                }
                if(flag)
                return i;
        }
    }
    return -1;
}
};

总结与思考:

这两种方法实际都是一种方法,只不过思考判断是否为子串的思维不一样而已。。

给出总结:
1.当用while循环时一定要注意越界问题
2.当用flag进行标记的时候,一定要在合适的时候重新置1

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值