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語言函式
- 【c語言】求絕對值C語言
- C語言nice()函式:改變程式優先順序C語言函式
- C語言 execve()函式C語言函式
- C語言常用函式C語言函式
- C語言函式sscanf()的用法C語言函式
- C語言qsort函式的使用C語言函式
- C語言lstat()函式:由檔案描述詞取得檔案狀態C語言函式
- C語言fstat()函式:由檔案描述詞取得檔案狀態C語言函式
- C語言 itoa函式及atoi函式C語言函式
- [ASM C/C++] C語言的main 函式ASMC++C語言AI函式
- C語言中函式的返回值C語言函式
- C語言函式呼叫棧C語言函式
- 詳解C語言函式C語言函式
- tmpnam() - C語言庫函式C語言函式
- tmpfile() - C語言庫函式C語言函式
- C語言時間函式C語言函式
- c語言函式庫(轉)C語言函式
- C語言函式題-查詢陣列每行的最大值C語言函式陣列
- C語言-字串函式的實現(一)之strlenC語言字串函式
- 尋找最大公因數(歐幾里得演算法)--C語言描述演算法C語言
- C語言函式一本道來C語言函式
- 猜數遊戲--C語言描述遊戲C語言
- c語言: 鍵盤輸入一個n個字元的串,然後按字母表順序輸出這n個字元C語言字元
- C語言庫函式及示例C語言函式
- C語言解讀assert函式C語言函式
- C#語言函式遞迴C#函式遞迴
- C語言 sizeof函式詳解C語言函式
- C語言標準函式庫C語言函式
- c#語言-高階函式C#函式
- C語言_簡單的階乘函式C語言函式
- C語言的比較庫函式--qsortC語言函式
- C語言fgetc()函式:讀檔案函式(由檔案中讀取一個字元)C語言函式字元
- 取冪運算--C語言描述C語言
- C語言-記憶體函式的實現(一)之memcpyC語言記憶體函式memcpy
- C語言函式指標與回撥用函式C語言函式指標
- C語言printf()函式:格式化輸出函式C語言函式
- C語言輸入一個數輸出對應的值C語言