每日一题
找出字符串中第一个匹配项的下标(实现strStr)
思路(暴力解法)
- 看到这题我们很容易想到,我们可以将字符串needle从头开始的每个字符逐一和字符串haystack的 字符逐一匹配(也是从第一个字符开始)
- 如果遇到不匹配的情况则继续从字符串haystack的第二个字符开始匹配,同理如果还是遇到不匹配的情况,则从第三个字符开始……以此类推,直至遍历完haystack或出现完全匹配的情况
- 若出现了完全匹配的情况,则返回第一个匹配项的下标,如示例一。
具体步骤
首先计算字符串haystack和字符串needle的长度
int len_hay = strlen(haystack); int len_need = strlen(needle); //如果needle的长度大于haystack的,那么不可能出现完全匹配的情况,直接返回-1 if(len_need > len_hay) return -1;
接着就开始将字符串needle和字符串haystack开始匹配,直至遍历完字符串haystack
实现代码
int strStr(char * haystack, char * needle){
int len_hay = strlen(haystack);
int len_need = strlen(needle);
if(len_need > len_hay)
return -1;
int i = 0,j = 0;
int count_j = 0;
while(1)
{
i = 0; //每一次都要从字符串needle第一个字符开始匹配
j = count_j;
if(haystack[j] == '\0') //如果if条件为真,就说明haystack已经遍历完,且没有出现完全匹配的情况,返回-1
return -1;
//将字符串needle和字符串haystack的字符逐一匹配
while(needle[i] == haystack[j] && needle[i] != '\0' && haystack[j]!= '\0')
{
i++;
j++;
}
//如果循环退出后needle[i]为'\0',就说明已经完全匹配,返回第一个匹配项的下标
if(needle[i] == '\0')
return count_j;
//如果未完全匹配,则从haystack的下一个字符开始重新与字符串needle进行匹配
else
count_j++;
}
return -1;
}
tips:这道题如果用暴力解法,其时间复杂度为O(M * N),其实正确的解法应该是KMP算法,这样可以将时间复杂度降为O(N)。博主在这里KMP算法详解中详细讲述了KMP算法的具体实现和本题的KMP解法,感兴趣的小伙伴可以去看看。