XDOJ_288 求一個順尋串的next函式值 C語言描述
問題描述:
所設計的程式能夠通過編譯。並能夠實現從輸入一個長度為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;
}
相關文章
- C語言的函式C語言函式
- C語言常用函式C語言函式
- C語言 execve()函式C語言函式
- C語言函式sscanf()的用法C語言函式
- C語言qsort函式的使用C語言函式
- 08. C語言函式C語言函式
- C語言 函式指標C語言函式指標
- C語言基礎函式C語言函式
- C語言函式呼叫棧C語言函式
- C語言中函式的返回值C語言函式
- C語言函式題-查詢陣列每行的最大值C語言函式陣列
- C語言-字串函式的實現(一)之strlenC語言字串函式
- C語言庫函式及示例C語言函式
- C語言解讀assert函式C語言函式
- C#語言函式遞迴C#函式遞迴
- c語言函式指標的定義C語言函式指標
- C語言函式指標與回撥用函式C語言函式指標
- C語言-記憶體函式的實現(一)之memcpyC語言記憶體函式memcpy
- 【C語言】函式的概念和函式的呼叫(引數傳遞)C語言函式
- C語言巨集和函式淺析C語言函式
- C 語言回撥函式詳解函式
- c語言快速排序(庫函式使用)C語言排序函式
- c語言學習筆記===函式C語言筆記函式
- C語言有關函式淺析C語言函式
- c語言是如何處理函式呼叫的?C語言函式
- C語言相關的基礎字串函式C語言字串函式
- C語言輸入一個數輸出對應的值C語言
- 【C語言】常用的字串函式及相關函式的自我實現C語言字串函式
- C 語言實現泛型 swap 函式泛型函式
- 題解1196:去掉空格 (C語言描述)C語言
- 包含min函式的棧(劍指offer)---C語言函式C語言
- c語言獲取陣列長度的函式C語言陣列函式
- C語言-字串函式的實現(五)之strstrC語言字串函式
- C語言函式指標與回撥函式使用方法C語言函式指標
- c語言遞迴函式實現求最大公約數(Euclid演算法)C語言遞迴函式演算法
- 二分搜尋演算法求元素位置(c語言)演算法C語言
- python語言幾個常見函式的使用Python函式
- 各個程式語言語言的檔案/函式/變數的命名方法函式變數