模式匹配 BF和KMP算法

BF和KMP算法(模式匹配)

模式匹配也称串匹配,或子串查找。用于在某文本中查找某特定的子串,其中,文本称为正文串,而要查找的内容称为模式串。通常正文是一个“大串”,而模式串只是一个“小串”。

设“a0a1…am-1”是长度为m的正文串,"p0p1…pn "是长度为n的模式串,且m≥n。模式匹配的含义是,求出最小的下标i=index(a,p)使得:aiai+1…ai+n-1=p0p1…p{n-1}。即在串a中寻找“最早发现的”子串p。如果a中不存在子串p,则返回无效地址-1。

BF算法

import java.util.Scanner;

public class BF {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String text = scanner.nextLine();
		String pattern = scanner.nextLine();

		int start = strstr(text.toCharArray(), pattern.toCharArray());
		if (start == -1) {
			System.out.println("匹配失败");
		} else {
			System.out.println(text.substring(start, start + pattern.length()));
		}
	}

	public static int strstr(char[] text, char[] pattern) {
		for (int i = 0; i < text.length - pattern.length; i++) {
			int j = 0, k = i;
			for (; j < pattern.length; j++, k++) {
				if (text[k] != pattern[j]) {
					break;
				}
			}
			if (j == pattern.length)
				return i;
		}
		return -1;
	}

}

KMP算法

import java.util.Scanner;

public class KMP {

	static int[] patternFail;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		String text = scanner.nextLine();
		String pattern = scanner.nextLine();

		int n = pattern.length();
		patternFail = new int[n + 1];
		getPatternFail(pattern.toCharArray(), n);
		int start = strstr(text.toCharArray(), pattern.toCharArray(), n);
		String result = text.substring(start, start + pattern.length());
		System.out.println(result);
	}

	public static int strstr(char[] text, char[] pattern, int n) {
		int k, j;
		k = j = 0;											//正文串指针k和模式串指针j的初值
		while (k < text.length && j < pattern.length) {		//当正文串和模式串都未测试完时循环
			if (j == -1) {									//若j推到头,k右移,j=0
				k++;
				j++;
				continue;
			}
			if (text[k] == pattern[j]) {					//若相配,k和j右移,继续本轮试匹配
				k++;
				j++;
				continue;
			}
			j = patternFail[j];								//若失配,k不变,j回退
		}
		if (j < pattern.length)	
			return -1;										//匹配失败
		return k - pattern.length;							//匹配成功
	}

	public static void getPatternFail(char[] pattern, int n) {	//计算失配函数表
		int k = 0, j;										
		j = patternFail[0] = -1;

		while (k < n) {
			if (j == -1) {
				j++;
				k++;
				patternFail[k] = 0;
				continue;
			}
			if (pattern[k] == pattern[j]) {
				j++;
				k++;
				patternFail[k] = j;
				continue;
			}
			j = patternFail[j];
		}

	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值