力扣初级算法-14-字符串-实现 strStr()

学习目标:

本次学习目标为 力扣初级算法-字符串,其中主要的LC如下:

  • 实现 strStr()

学习内容:

  1. 实现 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算法 ---- 待定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值