手写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)