学习目标:
本次学习目标为 力扣初级算法-字符串,其中主要的LC如下:
- 实现 strStr()
学习内容:
- 实现 strStr() -----(链接)
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。示例1:
输入:haystack = “hello”, needle = “ll”
输出:2示例2:
输入:haystack = “aaaaa”, needle = “bba”
输出:-1示例3:
输入:haystack = “”, needle = “”
输出:0说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
解题思路:
- 解法一: 循环判断
- 边界问题:
- 输入字符串为空或者 null 的问题
- 代码逻辑过程:
- 考虑边界问题,判断子字符串的长度
- 声明index i 和 j,分别都为 0,开始while循环,当两入参元素相等时,可进入下一位元素进行比较
- 当元素不相等时,入参 haystack 往右移动一位(此处的index 可以是当前位减去 j),但是 needle 得从头开始匹配,故 needle 的index 为 0
- 当 j 循环到等于 字符串 needl 的长度时,将 i 减去 j 得到的便是 needle 字符串出现的第一个位置
- 代码实现:
// 解法一: 循环解法
public int strStr01(String haystack, String needle) {
// 边界问题: 空或者 null
if (null == needle || needle.length() == 0 ){
return 0;
}
int i = 0;
int j = 0;
while (i < haystack.length() && j < needle.length()){
// 当两入参元素相等时,可进入下一位元素进行比较
if (haystack.charAt(i) == needle.charAt(j)){
i++;
j++;
}
// 当元素不相等时,入参 haystack 往右移动一位(此处的index 可以是当前位减去 j),但是 needle 得从头开始匹配,故 needle 的index 为 0
else {
i = i - j + 1;
j = 0;
}
if (j == needle.length()){
return i - j ;
}
}
return -1;
}
- 解法二: 循环截取整段字符做比较
- 边界问题:
- 输入字符串为空或者 null 的问题
- 代码逻辑过程:
- 考虑边界问题,判断子字符串的长度
- 先判断目标查询字符的长度
- 判断拿 needl 整体判断时,最多需要的循环次数 forNum
- 开始for循环,直接截取 i 到 i+length ,将截取到的字符与目标字符 needle 字符做比较,当两者相等时, i 则为 needle 字符串出现的第一个位置 。
- 代码实现:
// 解法二: 循环截取整段字符做比较
public int strStr02(String haystack, String needle) {
// 判断目标查找的字符长度
int length = needle.length();
// 判断一共需要循环的次数
int forNum = haystack.length() - length + 1;
for (int i = 0; i < forNum; i++) {
// 截取 i 到 i+length
if (haystack.substring(i, i + length).equals(needle)){
return i;
}
}
return -1;
}
- 解法三:KMP算法 ---- 待定