Leetcode--28.实现strStr()__考察KMP(C语言描述)(暴力法)

题目描述:
在这里插入图片描述
算法思想:本题采用暴力法解决,即两个for循环来分别遍历主串和子串,并利用哨兵,当主串与子串发生不匹配的时候直接开始下一轮匹配,存在的一个问题是当笔者采用上方的代码时,在极端代码情况下会产生运行超时,因此笔者先将两个数组长度进行计算,然后采用计算好的数据进行计算,超时现象不再出现。

本题一个巧妙之处在于,重新开始新一轮循环的时候,使用的判断语句为if(haystack[i + j] != needle[j]),这里的 i + j 就很便利的解决了主串每次的回溯问题。

/*          此代码逻辑没问题,但是在特(e)殊(xin)的测试用例的时候会运行超时
            故在改进版本先讲二者的数组长度计算出来,再利用长度参与运算
int strStr(char * haystack, char * needle)
{
    int i, j;
    int flag = 0;
    if(strlen(needle) == 0 && strlen(haystack) == 0)
        return 0;
    for(i = 0;i < strlen(haystack);i++)
    {
        flag = 0;
        for(j = 0;j < strlen(needle);j++)
        {
            if(haystack[i + j] != needle[j])
            {
                flag = 1;
                break;
            }
        }
        if(flag == 0)
            return i;
    }
    return -1;   
}*/
int strStr(char * haystack, char * needle)
{
    int i, j;
    int flag = 0;
    int hlen = strlen(haystack);
    int nlen = strlen(needle);         
    if(nlen == 0 && hlen == 0)      //如果两个长度均为0就返回0,否则返回-1
        return 0;
    for(i = 0;i < hlen;i++)
    {
        flag = 0;
        for(j = 0;j < nlen;j++)
        {
            if(haystack[i + j] != needle[j])        //当匹配出现不一样时,哨兵置1,直接开始下一轮匹配
            {
                flag = 1;
                break;
            }
        }
        if(flag == 0)               //当匹配完了以后哨兵没变化,因此此时的 i 就是所求的解
            return i;
    }
    return -1;   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值