XDOJ_288 求一個順尋串的next函式值 C語言描述

EverJi發表於2020-12-16

問題描述:

所設計的程式能夠通過編譯。並能夠實現從輸入一個長度為n的順序串str,並求出順序串str的next值。

輸入格式:

首先輸入串的長度n,然後輸入順序串str.

輸出格式:

輸出str的next值,以空格分隔。

樣例輸入:

8

a b c a b c b c

樣例輸出:

-1 0 0 0 1 2 3 0

思路描述

next函式值是KMP演算法中的next表,next就是回溯的時候要用到的“下一個位置”

其核心演算法主要就是模式串自己和自己匹配,用i和j兩個指標一前一後去走,(i是主串,j是這裡的“模式串”)next[0]按定義設為-1

演算法和KMP的演算法很像,i不斷往後走,是不回溯的,j如果沒匹配上則要回到他自己的next值所指的地方

當判斷發現i和j一樣的時候,也就是匹配上了,那麼i和j一起繼續往後走,並且把next(i+1)設為j+1(如果匹配上了,那麼當前相同前字尾的長度就+1,回溯的時候就回溯到j+1的位置)

如果不相等,就是沒匹配上,那麼讓j去找它自己的next值,遞迴的去找匹配的值

#include<stdio.h>
#include<string.h>
#define MAXSIZE 100

int main(){
	int i = 0, j = 0, n;
	char a[MAXSIZE], p[MAXSIZE];
	int next[MAXSIZE];
	scanf("%d\n", &n);
	gets(a);
	//去除字串中的空格 
	for(i=0; i<2*n-1; i++){
		if(a[i] != ' '){
			p[j] = a[i];
			j++;
		}
	}
	//求next表 
	next[0] = -1;
	i = 0; 
	j = -1;
	while(i<n){
		if(j==-1 || p[i] == p[j]){
			i++; j++;
			next[i] = j;
		}else{
			j = next[j];
		}
	}
	//輸出next表
	for(i=0; i<n; i++){
		printf("%d ", next[i]);
	} 
	return 0;
}

 

相關文章