leetcode 第28题 实现函数strStr

8 篇文章 0 订阅

leetcode 第28题 实现函数strStr 在主串中查找子串首次出现的位置

我的 思路 是从主串第一个位置开始与子串匹配,如果当前字母不匹配,那么 主串上次开始匹配的下一个位置 开始与子串的第一个字符开始匹配(这种方法存在回溯,也就是没有利用上次匹配的结果导致下次还是从头开始匹配。还有一种无回溯的字符串模式匹配KMP算法,效率会比这个高很多 ,时间复杂度为O(n+m),下次给出代码)。如果匹配到主串的剩余长度比子串小,说明肯定不匹配,就不用再往下匹配了。时间复杂度分析 最坏的情况是 主串的前(n - m)个字符都要比较m次(n为主串长度,m为子串长度),所以复杂度为o(n*m)。这种情况的出现是因为 每次匹配都必须把子串比较完才发现不匹配,栗子:主:aa aa aa aab 子:aab(请忽略主串中的空格,这里是为了看得方便) 。

class Solution {
public:
    int strStr(string haystack, string needle) {
    int lenh(haystack.length()),lenn(needle.length());
    if(lenn == 0)   return 0;
    if(lenh < 1) return -1;
    if(lenh < lenn) return -1;
    int i(0),startpos(0),j(0);
    while(i < lenh && j < lenn)
    {
        startpos = i;
        while(haystack[i] == needle[j] && j < lenn) i ++,j ++;
        if(j == lenn)
            return i - j;
        else
        {
            i = startpos + 1;
            j = 0;
        }
        if(lenh - i < lenn)
            break;
    }
    return -1;
    }
};

测试用例:

""
""

"string"
""

"str"
"string"

""
"str"

"mississippi"
"issip"

"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab"//要考虑到当主串的匹配长度已经比子串小的时候就没有必要再匹配了,如果忽略了这一点,当子串很长时,你的算法会超时的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值