1 条题解

  • 0
    @ 2025-2-21 19:50:42

    C :

    #include<stdio.h>
    #include<string.h>
    #define S 10000
    #define T 100
    int next[T]={0};
    void get_next(char t[],int next[])
    {
        int i=0,j=-1;
        while(t[i+1]!='\0')
        {
            if(j==-1||t[i]==t[j])
            {
                ++i;++j;
                next[i]=j+1;
            }
            else
                j=next[j]-1;
        }
    }
    void get_nextval(char t[],int next[])
    {
        int i=0,j=-1;
        while(t[i+1]!='\0')
        {
            if(j==-1||t[i]==t[j])
            {
                ++i;++j;
                if(t[i]!=t[j])
                    next[i]=j+1;
                else
                    next[i]=next[j];
            }
            else
                j=next[j]-1;
        }
    }
    int kmp(char s[],char t[],int pos)
    {
        int i=pos-1,j=0,a=strlen(s),b=strlen(t);
        while(i<=a-1&&j<=b-1)
        {
            if(j==-1||s[i]==t[j])
            {++i;++j;}
            else
                j=next[j]-1;
        }
        if(j==b)
            return i-j+1;
        else
            return 0;
    }
    int main()
    {
      int i,l;  char s[S],t[T];
        gets(t);
        get_next(t,next);
        //get_nextval(t,next);
        l=strlen(t);
      for(i=0;i<=l-1;i++)
      printf("%d ",next[i]);
      printf("\n");  
      return 0;
    }
    
    

    C++ :

    #include <stdio.h>
    #include <string.h>
    
    #define MAXSTRLEN 100
    typedef char SString[MAXSTRLEN+2];
    
    void InputString(SString &str) {
    	// 读取字符串
    	scanf("%s", str + 1); // 首先用scanf读取字符串
    	str[0] = strlen(str + 1); // 求出字符串的长度并保存在str[0]中
    }
    
    void get_next(SString T, int *next) { // 算法4.7
    	int i = 1;
    	next[1] = 0;
    	int j = 0;
    	while (i < T[0]) {
    		if (j == 0 || T[i] == T[j]) {
    			++i;
    			++j;
    			next[i] = j;
    		} else
    			j = next[j];
    	}
    }
    
    int main(){
    	SString str;
    	int next[MAXSTRLEN+2];
    	int i;
    	InputString(str);
    	get_next(str, next);
    	for(i=1; i<=str[0]; i++){
    		printf("%d ",next[i]);
    	}
    
    	return 0;
    }
    
    

    Pascal :

    program  a;
    var  t:ansistring;
         j,k:longint;
    	 next:array[0..100] of longint;
    
    procedure  get_next;
    begin
      j:=1; k:=0; next[1]:=0;
      while j<length(t) do
      if (k=0) or (t[j]=t[k]) then
          begin
            j:=j+1; k:=k+1; next[j]:=k;
          end
       else
         k:=next[k];
    end;
    
    begin
      readln(t);
      get_next;
      for  j:=1 to length(t) do
      write(next[j],' ');
    end.
    
    

    Java :

    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Main {
    
    	public static void main(String[] args) {
    		Scanner cin = new Scanner(System.in);
    		while (cin.hasNext()) {
    			testGetNext(cin);
    		}
    	}
    	
    	
    	public static void testGetNext(Scanner cin)
    	{
    		
    		String s = cin.nextLine();
    		int next[] = new int[s.length()];
    		getNext(s,next);
    //		System.out.println(Arrays.toString(next));
    		for( int i=0;i< s.length();i++)
    		{
    			System.out.print( (next[i] +1) +" " );
    		}
    		System.out.println();
    	}
    
    	public static int kmp(String s, String t) {
    		int next[] = new int[t.length()];
    		getNext(t, next);
    		int n = kmpMatch(s,t,next);
    		System.out.println(n);
    		return n;
    	}
    
    	private static int kmpMatch(String s, String t, int[] next) {
    		int j=0;
    		int len = t.length();
    		for(int i=0;i<s.length();i++)
    		{
    			if(s.charAt(i) == t.charAt(j)  )
    			{
    				if(j == len -1)
    					return (i-len+2);
    				j++;
    			}
    			else 
    			{
    				while(next[j] != -1)
    				{
    					if(s.charAt(i) == t.charAt(next[j]))
    					{
    						j= next[j] +1;
    						break;
    					}
    					else j= next[j];
    				}
    			}
    		}
    		return 0;
    	}
    
    	private static void getNext(String t, int next[]) {
    
    		next[0] = -1;
    		for (int i = 1; i < t.length(); i++) {
    			int k = next[i - 1];
    			if ( k!= -1  && t.charAt(k) == t.charAt(i-1))
    				next[i] = k + 1;
    			else
    			{
    				next[i] =0;
    				while( k!= -1 &&next[k]!= -1 )
    				{
    					k=next[k];
    					if(t.charAt(k) == t.charAt(i-1))
    					{
    						next[i] = k+1;
    					}
    				}
    				
    			}
    				
    		}
    	}
    }
    
    
    • 1

    算法4-7:KMP算法中的模式串移动数组

    信息

    ID
    976
    时间
    1000ms
    内存
    32MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者