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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值