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"//要考虑到当主串的匹配长度已经比子串小的时候就没有必要再匹配了,如果忽略了这一点,当子串很长时,你的算法会超时的。