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;
	}
}

你可能感兴趣的:(LeetCode,java,leetcode)