【字符串算法题记录】28. 找出字符串中第一个匹配项的下标

题目链接
这一题蛮简单,但是逻辑上容易忽略一些小细节。我一开始想的是从haystack数组的头开始找与needle匹配的第一个字符,然后再顺着看下面连续的字符是否匹配,然后直接返回结果,但是忽略了很重要的一点:haystack中可能有多个字符和needle的第一个字符是一样的,那么我们不能一次匹配就返回判断结果,而是要遍历整个haystack进行判断

class Solution {
    public:
    int strStr(string haystack, string needle) {
        int j = 0;
        int index = -1;
        for(int i = 0; i < haystack.size(); i++) { 
            if(haystack[i] == needle[j]) {  // 首先在haystack中找到needle的第一个字符
                index = i;  // 并记录第一个匹配字符的下标index
                // 进入循环检查是否接下来每一个字符都是与needle匹配的
                while(haystack[i] == needle[j] && j < needle.size() && i < haystack.size()) {
                    i++;
                    j++;
                }
                if(j == needle.size()) return index; // 如果needle中的字符全检查完了,则是匹配的,返回对应的index
                else return -1; // 如果needle中的字符没有检查完,即不匹配,则返回-1
            }
        }
        return index; // for循环已经结束都没有返回的话,说明haystack中没有匹配字符,则返回-1
    }
};

第二次修改后的如下,但是还是错了,因为我直接用外层的for循环的变量i去做字符串匹配检查,这其中包含了i++指令,更改了i的值,那么会影响到最外层的for循环

class Solution {
    public:
    int strStr(string haystack, string needle) {
        int index = -1; // index默认值是-1
        for(int i = 0; i < haystack.size(); i++) { 
            int j = 0;
            if(haystack[i] == needle[j]) {  // 首先在haystack中找到与needle匹配的第一个字符
                index = i;  // 并记录第一个匹配字符的下标index
                // 进入循环检查是否接下来每一个字符都是与needle匹配的
                while(haystack[i] == needle[j] && j < needle.size() && i < haystack.size()) {
                    i++;
                    j++; 
                }
                if(j == needle.size()) return index; // 如果needle中的字符全检查完了,则是匹配的,返回对应的index
                else index = -1; // 如果needle中的字符没有检查完,即不匹配,index要恢复默认值
            }
        }
        return index; // for循环已经结束都没有返回的话,说明haystack中没有匹配字符,则返回-1
    }
};

最终正确代码如下:

class Solution {
    public:
    int strStr(string haystack, string needle) {
        int index = -1; // index默认值是-1
        for(int i = 0; i < haystack.size(); i++) { 
            int j = 0;
            if(haystack[i] == needle[j]) {  // 首先在haystack中找到与needle匹配的第一个字符
                index = i;  // 并记录第一个匹配字符的下标index
                int k = i;  // 用k来代替i进行接下来的检查(不然i值被改变会影响最外层的for循环)
                
                // 进入循环检查是否接下来每一个字符都是与needle匹配的
                while(haystack[k] == needle[j] && j < needle.size() && k < haystack.size()) {
                    k++;
                    j++; 
                }
                if(j == needle.size()) return index; // 如果needle中的字符全检查完了,则是匹配的,返回对应的index
                else index = -1; // 如果needle中的字符没有检查完,即不匹配,index要恢复默认值
            }
        }
        return index; // for循环已经结束都没有返回的话,说明haystack中没有匹配字符,则返回-1
    }
};

最近更新

  1. TCP协议是安全的吗?

    2024-03-30 07:34:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-30 07:34:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-30 07:34:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-30 07:34:03       18 阅读

热门阅读

  1. 算法部署总结

    2024-03-30 07:34:03       19 阅读
  2. L2-3 图着色问题

    2024-03-30 07:34:03       16 阅读
  3. 【每日一题】C++生成组合数

    2024-03-30 07:34:03       19 阅读
  4. vue3组件传参

    2024-03-30 07:34:03       17 阅读
  5. 2024.3.29

    2024-03-30 07:34:03       14 阅读
  6. 【算法】归并排序(迭代法)

    2024-03-30 07:34:03       18 阅读
  7. 代码审计与web安全:第一章作业

    2024-03-30 07:34:03       15 阅读
  8. 基于神经网络的人脸识别系统的设计与实现

    2024-03-30 07:34:03       20 阅读