LeetCode----Implement strStr()

这是算法中比较经典的问题,判断一个字符串是否是另一个字符串的子串。这个题目最经典的算法应该是KMP算法.KMP算法是最优的线性算法,复杂度已经达到这个问题的下限。但是KMP算法比较复杂,很难在面试的短时间里面完整正确的实现。

下面介绍两种解题方法:(1)brute force (2)KMP

(1)brute force 

public static int strStr(String haystack, String needle) {
		for(int i=0;;i++){
			for(int j=0;;j++){
				if(j==needle.length())
					return i;
				if(i+j==haystack.length())
					return -1;
				if(needle.charAt(j)!=haystack.charAt(i+j))
					break;
			}
		}
    <span style="white-space:pre">	</span>}
(2)KMP

static void getNext(String str,int next[]){
		int i=0,j=-1;
		next[0]=-1;
		while(i<str.length()){
			if(j==-1||str.charAt(i)==str.charAt(j)){
				i++;
				j++;
				next[i]=j;
			}
			else {
				j=next[j];
			}
		}
	}
	public static int strStrKMP(String haystack, String needle,int pos) {
		int []next=new int[haystack.length()];
		getNext(needle, next);
		int i=pos,j=0;
		while(i<haystack.length()&&j<needle.length()){
			if(j==-1||haystack.charAt(i)==needle.charAt(j)){
				i++;
				j++;
			}
			else
				j=next[j];
		}
		if(j>=needle.length())
			return i-needle.length();
		else
			return 0;
    }

你可能感兴趣的:(LeetCode----Implement strStr())