字符串模式匹配

本文详细介绍了快速字符串匹配算法的设计与实现,包括失败函数的计算方法及应用过程,旨在提高匹配效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class StringMatching {
	public int[] fail = null;//失败函数
	//fail[j]只和模式的前j个字符构成有关,而与目标字符串无关
	//fail[j]={k, 若k为满足:o<=k<j,且p0p1...pk = pj-k=j-k+1....pj的最大整数
	//........{...若k找不到,则=-1; 

	public int fastFind(String dest, String pat) {

		int dpoint = 0;// 目标扫瞄的初始位置
		int ppoint = 0;// 模式扫瞄的初始位置

		int dsize = dest.length();// 目标字符串的长度
		int psize = pat.length();// 模式字符串的长度

		if (dsize < 1 || psize < 1 || dsize < psize) {
			return -1;
		}
		caculateFail(pat);
		while (ppoint < psize && dpoint < dsize) {
			{
				if (pat.charAt(ppoint) == dest.charAt(dpoint)) {
					ppoint++;
					dpoint++;
				} else if (ppoint == 0) {// 若第一个字符就匹配失败,从S的下一个字符开始
					dpoint++;
				} else
					ppoint = fail[ppoint - 1] + 1;// 用失败函数确定p就回溯到的字符位置
			}

		}
		if (ppoint < psize) {// 匹配失败
			return -1;
		}
		return dpoint - psize;
	}

	private void caculateFail(String pat) {

		int psize = pat.length();
		fail = new int[psize];
		// init赋初值
		fail[0] = -1;
		//计算fail
		int i = 0;
		for (int j = 1; j < psize; j++) {
			i = fail[j - 1];
			while (pat.charAt(j) != pat.charAt(i + 1) && i > 0) {
				i = fail[i];
			}
			if (pat.charAt(j) == pat.charAt(i + 1)) {
				fail[j] = i + 1;
			} else
				fail[j] = -1;
			// System.out.println("fail[" + j + "] =" + fail[j]);
		}

	}

	 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值