LeetCode刷题day028 (Jieky)

LeetCode第28题

/*
Implement strStr().
Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

Example 1:
Input: haystack = "hello", needle = "ll"
Output: 2

Example 2:
Input: haystack = "aaaaa", needle = "bba"
Output: -1
*/
public class ImplementstrStr{
	public static void main(String[] args){
		
		String haystack = "mississippi";
		String needle = "mississippi";
		ImplementstrStr iss = new ImplementstrStr();
		int result = iss.strStr(haystack,needle);
		System.out.println(result);
	}
	
	public int strStr(String haystack, String needle) {
		if (haystack == null || needle == null) return -1;
		if (haystack.length() < needle.length()) return -1;
		// 空字符串是任何字符串的子串
		if ("".equals(needle)) return 0;
		
		// 和01版本的思想几乎等同
		// 看似只用了一个for循环(但是有回退操作),实则等效有一个内部循环
		// 没有01版本思路清晰,而且当剩下子串长度不足时不会提前结束比较
		int j = 0;
		for (int i=0;i<haystack.length();i++){
			// 前j个字符相等就一直往下比较,否则从i+1处重新开始比较
			if (haystack.charAt(i) == needle.charAt(j)) {
				j++;
				if (j == needle.length()) return i - j + 1;
			}else {
				// i减去i从开始标记位置多走的位移
				i = i - j;
				// j清零
				j = 0;
			}
		}
		
		return -1;
	}
	
	public int strStr01(String haystack, String needle) {
		if (haystack == null || needle == null) return -1;
		if (haystack.length() < needle.length()) return -1;
		// 空字符串是任何字符串的子串
		if ("".equals(needle)) return 0;
		
		for (int i=0;i<haystack.length();i++){
			// 剩余子串长度不够则跳出
			if (haystack.length() - i < needle.length()) break;
			// 比对两个子串的每一个字符
			int cur = i;
			for (int j=0;j<needle.length();j++){
				if (haystack.charAt(cur++) != needle.charAt(j)) break; 
				if (j == needle.length() - 1) return i;
			}
		}
		
		return -1;
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值