小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目描述
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例 1:
输入:haystack = "hello", needle = "ll"
输出:2
示例 2:
输入:haystack = "aaaaa", needle = "bba"
输出:-1
示例 3:
输入:haystack = "", needle = ""
输出:0
提示:
0 <= haystack.length, needle.length <= 5 * 104 haystack 和 needle 仅由小写英文字符组成
思考过程
进行匹配,可以使用双指针进行判断.
当开始匹配时,左指针和右指针同时进行移动匹配下一个字符是否相等
当匹配途中失败,需要返回到开始匹配的位置,因此需要记录起始位置.
当匹配失败分成两种情况: 1.不处于匹配阶段,左指针移动
2.处于匹配阶段: 左指针返回到起始位置+1,右指针置0;
题解
1.先进行特殊判断,当右字符串为空时,返回0
2.用左右指针进行比较判断.
2.1 当指针相等时,进入匹配阶段.
2.1.1 匹配阶段标识符置为1,记录匹配的起始位置,左右指针同时向前移动
2.1.2 判断右指针是否超过字符串长度,当超过时,代表全部匹配,返回起始位置
2.2 指针不相等时
2.2.1 处于匹配阶段:匹配结束,标识符置为0.左指针回到起始位置,右指针置为0
2.2.2 不处于匹配阶段,左指针继续移动
3.循环结束,返回-1,没有找到匹配结果.
public static int strStr(String haystack, String needle) {
// 当needle为空字符串时,返回0
if (0 == needle.length()) {
return 0;
}
char[] chars = haystack.toCharArray();
char[] chars1 = needle.toCharArray();
int left = 0;
int right = 0;
// 记录本次匹配相等的起始位置
int leftTemp = 0;
// 用于标记是否处于匹配相等阶段
int flag = 0;
while (left < haystack.length() && right < needle.length()) {
// 相等,进行下一个判断.
if (chars[left] == chars1[right]) {
// 当已标记时,不用更新起始位置
if (flag == 0) {
leftTemp = left;
}
flag = 1;
left ++;
right ++;
}
// 不相等分两种情况,
else {
//当前处于相等匹配阶段时,需要将右指针置0,左指针变成第一次相等的位置+1
if (flag == 1) {
flag = 0;
left = leftTemp + 1;
right = 0;
}
else {
left ++;
}
}
}
// 当超过右字符串长度,匹配完成,返回起始位置
if (right == needle.length()) {
return leftTemp;
}
return -1;
}