每日一题——找出字符串中第一个匹配项的下标(实现strStr)(暴力解法)

简介: 每日一题——找出字符串中第一个匹配项的下标(实现strStr)(暴力解法)

找出字符串中第一个匹配项的下标(实现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算法求解。


相关文章
|
11月前
|
算法
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
【LeetCode】每日一题&&两数之和&&寻找正序数组的中位数&&找出字符串中第一个匹配项的下标&&在排序数组中查找元素的第一个和最后一个位置
|
3月前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标
|
5月前
|
算法 Java
力扣经典150题第二十三题:找出字符串中第一个匹配项的下标
力扣经典150题第二十三题:找出字符串中第一个匹配项的下标
26 0
|
5月前
leetcode题解:28.找出字符串中第一个匹配项的下标
leetcode题解:28.找出字符串中第一个匹配项的下标
25 0
|
6月前
【力扣】28. 找出字符串中第一个匹配项的下标
【力扣】28. 找出字符串中第一个匹配项的下标
|
6月前
|
算法
六六力扣刷题字符串之找出字符串中第一个匹配项的下标
六六力扣刷题字符串之找出字符串中第一个匹配项的下标
59 0
题目:下列给定程序中函数fun的功能是:从p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。
题目:下列给定程序中函数fun的功能是:从p所指字符串中找出ASCII码值最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。
|
算法
LeetCode150道面试经典题--找出字符串中第一个匹配项的下标(简单)
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
45 0
|
存储 算法 Python
【力扣算法20】之 8. 找出字符串中第一个匹配项的下标 (python方向)
【力扣算法20】之 8. 找出字符串中第一个匹配项的下标 (python方向)
131 0
|
Java
NetEase网易 Java笔试题 给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、“b“、“c”、“x”、“y“、“z”在字符串中都恰好出现了偶数次(0也是偶数)
NetEase网易 Java笔试题 给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、“b“、“c”、“x”、“y“、“z”在字符串中都恰好出现了偶数次(0也是偶数)
115 0
下一篇
无影云桌面