Java中如何手动实现字符串子串查找?现有代码逻辑是否正确?
你的代码同时存在逻辑错误和实现问题,具体问题如下:
- 匹配失败后未重置子串指针
当部分字符匹配成功、后续匹配失败时,你仅移动主串下标,没有将子串下标otherIndex重置为0,会导致后续匹配完全错位。例如主串为abac、目标子串为ac时,前两位a匹配、b与c不匹配后,otherIndex会停留在1,后续主串的a、c都会和子串下标1的c对比,最终漏判实际存在的子串。 - 匹配成功的判断条件错误
你设置的判断条件otherIndex == s.length()-1完全不符合执行逻辑:- 若子串长度为1,
s.length()-1为0,匹配到对应字符后otherIndex会加1变为1,永远无法满足判断条件,会漏判所有长度为1的子串。 - 子串长度大于1时,匹配到最后一位字符后
otherIndex会加1,此时值等于子串总长度,你设置的条件永远无法触发正确的成功返回。
- 若子串长度为1,
- 匹配失败后主串指针移动逻辑错误
部分匹配失败后,主串指针不能直接加1,需要回退到本次匹配起始位置的下一位,否则会漏判匹配起始位置交错的场景。例如主串为ababc、子串为abc时,若第一次匹配从下标0开始失败,主串指针需要回退到下标1重新匹配,否则会错过后续的正确子串。
修正后的代码示例:
public int lookFor(String s) { final int EXIST = 1; final int NOT_EXIST = -1; int thisIndex = 0; int otherIndex = 0; // 提前处理边界情况:子串为空/子串长度大于主串直接返回不存在 if (s == null || s.length() == 0 || s.length() > this.mainString.length()) return NOT_EXIST; while(thisIndex < this.mainString.length()) { char thisNext = this.mainString.charAt(thisIndex); char otherNext = s.charAt(otherIndex); if (thisNext == otherNext) { thisIndex++; otherIndex++; } else { // 匹配失败,主串指针回退到本次匹配起始点的下一位,子串指针重置为0 thisIndex = thisIndex - otherIndex + 1; otherIndex = 0; } // 子串所有字符全部匹配完成,返回存在标识 if (otherIndex == s.length()) return EXIST; } return NOT_EXIST; }
内容的提问来源于stack exchange,提问作者EladO O
相关产品推荐
相关产品推荐

