KMP算法——返回str2在str1中的索引

判断字符串str1中是否包含str2,如果包含,返回str2在str1中的索引。
时间复杂度O(n)的解法:

//KMP算法解决的问题
//字符串str1和str2,str1是否包含str2,如果包含返回str2在str1中开始的位置。
//如何做到时间复杂度O(N)完成
public class KMP {

	public static int getIndexOf(String s, String m) {
		if (s == null || m == null || m.length() < 1 || s.length() < m.length()) {
			return -1;
		}
		char[] str1 = s.toCharArray();
		char[] str2 = m.toCharArray();
		int i1 = 0;
		int i2 = 0;
		//next为指定i2下一个跳跃节点的数量,即往前跳next[i]个字符再进行比较
		int[] next = getNextArray(str2);
		//要求i1和i2均不越界
		while (i1 < str1.length && i2 < str2.length) {
			//如果str1和str2来到共同字符,二者均++
			if (str1[i1] == str2[i2]) {
				i1++;
				i2++;
				//next[i2] == -1表示已经越界
			} else if (next[i2] == -1) {
				i1++;
				//i2可以继续往前跳
			} else {
				i2 = next[i2];
			}
		}
		//i1越界或者i2越界了,返回
		return i2 == str2.length ? i1 - i2 : -1;
	}

	public static int[] getNextArray(char[] ms) {
		if (ms.length == 1) {
			return new int[] { -1 };
		}
		int[] next = new int[ms.length];
		//人为规定0位置-1,1位置为0
		next[0] = -1;
		next[1] = 0;
		int i = 2;	//next数组的位置
		int cn = 0;
		while (i < next.length) {
			if (ms[i - 1] == ms[cn]) {		//i-1与cn位置比较,如果相等,next[i]改为cn+1
				next[i++] = ++cn;
			} else if (cn > 0) {	//当前跳到cn位置的字符,和i-1位置的字符匹配不上
				cn = next[cn];
			} else {
				next[i++] = 0;
			}
		}
		return next;
	}

	public static void main(String[] args) {
		String str = "abbtabbzcabbtabbe";
		String match = "cabbtabbe";
		System.out.println(getIndexOf(str, match));

	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值