题目要求
解题思路
其一:BF解法
使用双指针分别指向haystack和needle的指针h以及n分两种情况处理上述问题
a. 当haystack[h]==needle[n]时,将两指针均向前移动,继续向后匹配
h++;n++;
b. 当haystack[h]!=needle[n]时 ,两指针h和b所指的字符不相匹配,回溯将n指针回溯回起始位置needle[0],同时将h指针从匹配位置向前进一位
h=h-n+1;
n=0;
注意:
语句的顺序极其重要!!!必须先将h指针回溯,保证了此时的n指针的值还没变化,当h指针归位后才能将n指针归位(答主的惨痛教训)
当回溯完成,指针归位后,在此情况下对回溯后的情况进行判断:是否归位后的字符可以匹配,如果不相匹配,将指向haystack的指针向前移动(此语句极其重要不可缺少,不可合并在下一次循环中,否则将陷入死循环中,h指针永远不向前移动
if(haystack[h]!=needle[n])
h++;
总代码
class Solution {
public:
int strStr(string haystack, string needle) {
if(!needle.length())
return 0;
int h=0,n=0;
while(h<haystack.length()&&n<needle.length()){
if(haystack[h]==needle[n]){
h++;n++;
}else{
h=h-n+1;
n=0;
if(haystack[h]!=needle[n])
h++;
}
}
return n==needle.length()?h-needle.length():-1;
}
};
小结:BF算法虽然易于理解和掌握但由于每当出现不相匹配的情况时,h指针都得回溯到初始位置的下一位以及n指针回溯到0的位置,效率低下,因此时间复杂度高
优化
针对上述BF算法的暴力求解时间复杂度高,效率低下的问题,由此延伸出KMP算法,极大的解决了上述问题但由于KMP算法过于繁琐以及答主纵阅多篇文章回答,发现一位答主的回答很详尽也便于理解,由此引用一下大佬的回答(大佬要是介意的话,答主会删除的QAQ)
其二: KMP算法
答主弱弱吐槽一句,凭什么leecode把它归为简单啊QAQ,不会KMP不配刷题吗QAQ