最長回文列時間複雑度nソルバー(マラ車アルゴリズムコード)

1840 ワード

今日はleetcodeで文字列を返している時にこのアルゴリズムを発見しました.文字列を探している時間の複雑さをnにするアルゴリズムです.
前にいくつかのブログを使って説明しましたが、いわゆるか分かりません.見れば見るほど目眩がします.実はアルゴリズムは簡単で、最初から最後までlen配列を求める過程です.
ここでこのブログを紹介します.このブログでこのアルゴリズムが分かります.https://blog.csdn.net/dyx404514/article/details/42061017)
注意する必要があるのは、菗号と数字0の位置に$を追加する理由です.
次にコードを貼ります.
public static String longestPalindrome(String s) {
            //char        string   
	        char p[]=new char [2*s.length()+3];
            p[0]='$';p[1]='#';
	        p[2*s.length()+2]='\0';

            //sum[i]  i           
            int sum[]=new int[2*s.length()+3];
            sum[0]=1;sum[1]=1;
            
            //    
	        for(int i=1;i<=s.length();i++) {
	        	p[2*i]=s.charAt(i-1);
	        	p[2*i+1]='#';
	        	
	        }
            
            //max          ,maxindex           
	        int max=-1;int maxindex=-1;

            //       i           ,   sum[i] 
	        for(int i=2;i<2*s.length()+3;i++) {
	        	int tem=-2;
                //i        
	        	if(i>=max)
	        		{sum[i]=getsum(p, i);tem=sum[i];}
	        	else {
                //   
	        		if(sum[2*maxindex-i]+i-1<=max)
	        			sum[i]=sum[2*maxindex-i];
	        		else
	        			{sum[i]=getsum(p, i);tem=sum[i];}
	        	}
	        	if(tem>max) {
	        		max=tem;maxindex=i;
	        	}
	        }
	       System.out.println(maxindex);
	       System.out.println(max);
	    
	    	   int len=(max-1);
	    	   int j=0;
	    	   char returnarr[]=new char [len];
	    	   for(int i=maxindex-max+2;i=0&&b