力扣28题-找出字符串中第一个匹配项的下标

力扣28题-找出字符串中第一个匹配项的下标

给你两个字符串haystack 和 needle ,
请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。
如果needle 不是 haystack 的一部分,则返回 -1 。

文章目录

  • 力扣28题-找出字符串中第一个匹配项的下标
  • 一、问题描述
  • 二、示例
  • 三、提示
  • 四、问题分析
  • 五、解法
  • 六、代码分析
  • 总结



一、问题描述

给你两个字符串haystack 和 needle ,
请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。
如果needle 不是 haystack 的一部分,则返回 -1 。

二、示例

力扣28题-找出字符串中第一个匹配项的下标_第1张图片
力扣28题-找出字符串中第一个匹配项的下标_第2张图片

三、提示

  • 1 <= haystack.length, needle.length <= 104
  • haystack 和 needle 仅由小写英文字符组成

四、问题分析

这道题实际上要找的是needle字符串在haystack字符串中的起始索引,但是needle字符串必须要是第一次完整出现的,当检测到第一次完整出现后,立即返回,不需要再进行遍历

五、解法

 //表示此时匹配到的needle索引
        int j=0;
        int left=0;
        int right=0;
        for (int i = 0; i < haystack.length(); i++) {
            if(haystack.charAt(i)==needle.charAt(j)){
                left=i;
                while(haystack.charAt(i)==needle.charAt(j)&&j<needle.length()&&i<haystack.length()){
                    i++;
                    j++;
                    right=j+left;
                    if(i==haystack.length()||j==needle.length()){
                        break;
                    }
                }
                if((right-left)==needle.length()){
                    //此时已经找到相同的字符串
                    return left;
                }else{
                    i=left;
                    j=0;
                }
            }
        }
        return -1;

六、代码分析

		int j=0;
        int left=0;
        int right=0;

这里的j表示的是在遍历过程中needle字符串的索引
left表示的是出现needle字符串第一个字符的索引
right表示的是此时与needle字符串中相等的索引,right在代码运行过程中是不断更新的。

for (int i = 0; i < haystack.length(); i++) {
            if(haystack.charAt(i)==needle.charAt(j)){
                left=i;
                while(haystack.charAt(i)==needle.charAt(j)&&j<needle.length()&&i<haystack.length()){
                    i++;
                    j++;
                    right=j+left;
                    if(i==haystack.length()||j==needle.length()){
                        break;
                    }
                }
                if((right-left)==needle.length()){
                    //此时已经找到相同的字符串
                    return left;
                }else{
                    i=left;
                    j=0;
                }
            }
        }

这里的外层循环,是haystack字符串的遍历
当遇到有与needle字符串第一个字符相等的索引,立即用left记录
然后进行一个while循环,来查找知道不相等的字符的索引,如果在这个过程中,遇到 i等于haystack.length()||j等于needle.length(),直接进行break,此时如果继续进行循环,会出现索引越界异常。
从while循环出来之后,判断找到的right与left索引的差与needle的长度进行比较,
如果相等返回left,程序运行结束。
如果不相等,将i恢复到进入while循环前的值,将j归0,继续进行循环。

总结

本道题难度相当一般但是通常在字符串类类型的题目,往往想法比较简单,但是实现起来并不容易,复杂的字符串题目非常考验对代码的掌控能力。

双指针法是字符串处理的常客。

你可能感兴趣的:(力扣算法题,leetcode,算法,数据结构)