KMP算法部分匹配值计算-Java实现

假设需要使用KMP算法来寻找在某一段字符串中是否出现"ABCDABD"这个字符串,那么KMP算法最终要的一环就是计算该字符串的部分匹配值。

首先文字分析该字符串的部分匹配之的含义:

  • 1,P[0]表示“A”,其完全前后缀都是空,所以其部分匹配值为0
  • 2,P[1]表示“AB”,其完全前缀为{空,A},完全后缀为{B,空},前后缀中只有空相同,所以AB(即P[1])的匹配值为0
  • 3,P[2]表示“ABC”,其完全前缀为{空,A,AB},完全后缀为{BC,B,空},前后缀中只有空相同,所以ABC(即P[2])的匹配值为0
  • 4,P[3]表示“ABCD”,其完全前缀为{空,A,AB,ABC},完全后缀为{BCD,CD,D,空},前后缀中只有空相同,所以ABCD(即P[3])的匹配值为0
  • 5,P[4]表示“ABCDA”,其完全前缀为{空,A,AB,ABC,ABCD},完全后缀为{BCDA,CDA,DA,A,空},前后缀中都有{A}长度为1,所以ABCDA(即P[4])的匹配值为1
  • 6,P[5]表示“ABCDAB”其完全前缀为{空,A,AB,ABC,ABCD,ABCDA},完全后缀为{BCDAB,CDAB,DAB,AB,B,空},前后缀中都有{AB}长度为2,所以ABCDAB(即P[5])的匹配值为2
  • 7,P[6]表示“ABCDABD”其完全前缀为{空,A,AB,ABC,ABCD,ABCDA,ABCDAB},完全后缀为{BCDABD,CDABD,DABD,ABD,BD,D,空},前后缀中只有空相同,所以ABCDABD(即P[6])的匹配值为0

import java.util.Scanner;
public class KMP_pipei {

	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		while(scan.hasNext()){
			String A = scan.nextLine();
			//记录字符串的匹配值机对应的字符串
			String jilu[][] = new String[A.length()][2];
			for(int i = 0;i<A.length();i++){
				String B = A.substring(0, i+1);
				int changdu = chkRotation(B, B.length());
				String sub = B.substring(0, changdu);
				jilu[i][0] = B;
				jilu[i][1] = String.valueOf(changdu);
				System.out.printf("%s的匹配值为%s\n",jilu[i][0],jilu[i][1]);
			}
		}
	}

	//计算字符的匹配
	 public static int chkRotation(String A, int lena) {
	        String Abefore[] = new String[lena-1];
	        String Aafter[] = new String[lena-1];
	      
	        int k=0;
	        int value = 0;
	      
	        //计算部分匹配值,存放前缀
	        for(int i=0;i1;i--){
	            Aafter[lena-i] = A.substring(lena-i+1,lena); 
	        }
	        //循环比较找出构建的数组中相同的字符段
	        while(k<lena-1){
	            if(Abefore[k].equals(Aafter[lena-k-2])){
	                value = Abefore[k].length();
	            }
	            
	            k++;
	        }
	        return value;  
	    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KMP算法实现是通过计算模式串的next数组,然后在主串中进行匹配。在Java中,可以按照以下步骤实现KMP算法: 1. 首先,定义一个函数来计算模式串的next数组,即模式串T中每一个长度为j (0 < j < T.length) 的前缀所对应的next[j]的。这个函数可以按照以下步骤进行计算: - 初始化一个长度为T.length的next数组,并将其所有元素初始化为0。 - 使用两个指针i和j,分别指向模式串的第一个字符和第二个字符。 - 循环遍历模式串的字符: - 如果T[i]等于T[j],则将next[j+1]的设置为j+1,并将i和j都加1。 - 如果T[i]不等于T[j],则判断j的: - 如果j等于0,则将next[j+1]的设置为0,并将i加1。 - 如果j不等于0,则将j更新为next[j]的。 2. 定义一个函数来进行匹配,接收一个主串S和一个模式串T作为参数。这个函数可以按照以下步骤进行匹配: - 使用两个指针i和j,分别指向主串和模式串的第一个字符。 - 循环遍历主串的字符: - 如果S[i]等于T[j],则将i和j都加1。 - 如果S[i]不等于T[j],则判断j的: - 如果j等于0,则将i加1。 - 如果j不等于0,则将j更新为next[j]的。 3. 在匹配过程中,如果j的等于模式串的长度,则说明匹配成功,返回主串中匹配的起始位置。 下面是KMP算法Java实现代码: ```java public class KMP { public int kmpMatch(String S, String T) { char[] sArr = S.toCharArray(); char[] tArr = T.toCharArray(); int[] next = getNext(T); int i = 0, j = 0; while (i < sArr.length && j < tArr.length) { if (sArr[i] == tArr[j]) { i++; j++; } else if (j == 0) { i++; } else { j = next[j]; } } if (j == tArr.length) { return i - j; } else { return -1; } } private int[] getNext(String T) { char[] tArr = T.toCharArray(); int[] next = new int[tArr.length]; int i = 0, j = -1; next[0] = -1; while (i < tArr.length - 1) { if (j == -1 || tArr[i] == tArr[j]) { i++; j++; next[i] = j; } else { j = next[j]; } } return next; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值