手写Java函数IndexOf,leetcode28

1.问题不再描述

实现A.indexOf(B)

2.思路

两个字符串各设置一个指针,进行匹配,下面将A称为母串,B称为子串,指针分别称为母指针和子指针。

两个指针指向的字符如果相同的话,判断是否是匹配状态,如果两个字符串是第一次匹配,就记录下当前位置,并继续向后匹配。

因此,我们需要判断当前是否在匹配状态中,使用布尔标值来判断。如果两个字符串是第一次匹配,还需要将标值改为匹配状态。

如果已在匹配状态,只需要向后移动即可。

如果两个字符不匹配,子指针直接置0,母指针返回到本次匹配开始字符位置的后一位,而非当前位置向后一位

 

以字符串“mississippi”和"issip"为例(lc测试用例45),初始状态如下:

 

 

 第一次没有匹配上,因此,子指针置0,状态改为不匹配,母指针加1,变成下图所示情况

 

 

 

 注意,此次母子指针能够匹配,判断标志f的状态,是fasle表示本次匹配是匹配的开始,记录下匹配开始的位置Index = 1,然后将f修改为true,表示在匹配状态中。两个指针同时向后移动一位

 

接下来仍是匹配,但是由于f已经是true,此时表示正在匹配状态中,只需将两个指针向后移动即可,直到子串被完全匹配或者匹配到一半停止,如下所示

 

 不匹配,子指针置0,母指针看index是否为-1,如果不是,那就变成Index+1,匹配状态重置为未匹配,并且将Index重置为-1

 

 直到再次匹配。

3. 代码实现

class Solution {
    public int strStr(String haystack, String needle) {
            int len = haystack.length();
            int len2 = needle.length();
            if(len2 == 0)
            return 0;
            if(len2 > len)
            return -1;
            int i = 0, j = 0;
            int Ind = -1;
            boolean f = false;
            while(i < len && j < len2)
            {
                if(haystack.charAt(i) == needle.charAt(j) )
                {
                    if(f == false)
                    {
                        Ind = i;
                        i++;
                        j++;
                        f = true;
                    }
                    else
                    {
                        i++;
                        j++;
                    }
                }
                else
                {
                    i = (Ind == -1)?(i+1):(Ind+1);
                    j = 0;
                    f = false;
                    Ind = -1;
                }
            }
            if(j < len2)
            Ind = -1;
            return Ind;
    }
}

 4.遇到的问题

(1)未考虑到母串比子串短的情况

(2)

posted @ 2020-08-07 16:47  LeftBody  阅读(249)  评论(0编辑  收藏  举报