8591 計算next值 SCAU 華南農業大學 資料結構實驗(個人筆記 勿噴)

木杏夢發表於2020-10-10
//預備知識:https://www.bilibili.com/video/BV1NJ411k7qw?from=search&seid=7718061884170427148
//預備知識:https://www.bilibili.com/video/BV1uJ411s7br/?spm_id_from=333.788.videocard.0  可以不看

//程式碼分析視訊:https://www.bilibili.com/video/BV1T4411P7AG?from=search&seid=15200189655283235603

//Description 編寫演算法,錄入多個字串計算並驗證NEXT值,輸入0結束。本題目給出部分程式碼,請補全內容。]
#include <stdio.h>
#include "stdlib.h"
#define MAXSTRLEN 255                         // 使用者可在255以內定義最大串長
typedef unsigned char SString[MAXSTRLEN + 1]; // 0號單元存放串的長度
                                              //將sstring定義成一個型別,這個型別為一個unsigned char型別的陣列,陣列的長度為MAXSTRLEN+1

void get_next(SString T, int next[])
{
    // 演算法4.7
    // 求模式串T的next函式值並存入陣列next
    // 請補全程式碼

    int i; //i是字尾
    int j; //j是字首

    i = 1; //字尾初始化
    j = 0; //字首初始

    next[1] = 0;
    while (i < T[0]) //字首只要小於字串長度就可以繼續判斷
    {
        if (T[j] == T[i] || j == 0)  //這裡不可以鞋 i==0,因為到後面j有可能會回溯,要用j做判斷條件,如果用i會卡死
        {
            i++;         //字尾後移一個
            j++;         //字首也後移一個
            next[i] = j; //匹配成功就可以填next值陣列
        }
        else
        {
            j = next[j]; //匹配失敗,j字首回溯到上一次匹配成功的第一個位置,
        }
    }
}
int  main()
{
    int next[MAXSTRLEN]; //接收next值
    SString S;           // 等價於char S[MAXSTRLEN + 1]
    int n, i, j;
    char ch;
    scanf("%d", &n); // 指定要驗證NEXT值的字串個數
    ch = getchar();  //接收換行符
    for (i = 1; i <= n; i++)
    {
        ch = getchar();
        for (j = 1; j <= MAXSTRLEN && (ch != '\n'); j++) // 錄入字串  ,j是從1開始的
        {
            S[j] = ch;
            ch = getchar();
        }
        S[0] = j - 1; // S[0]用於儲存字串中字元個數
        get_next(S, next);
        printf("NEXT J is:");
        for (j = 1; j <= S[0]; j++)
            printf("%d", next[j]);
        printf("\n");
    }
}

/*
輸入格式
第一行:輸入n,表示有n個需計算NEXT值的字串
第二至n+1行:每行輸入一個字串


輸出格式
第1至第n行:通過計算每相應行的字串得出的NEXT值


輸入樣例
4
abcdefg
aaaaab
abaabcac
aaabaaab


輸出樣例
NEXT J is:0111111
NEXT J is:012345
NEXT J is:01122312
NEXT J is:01231234
*/

 

相關文章