最長回文列時間複雑度nソルバー(マラ車アルゴリズムコード)
1840 ワード
今日はleetcodeで文字列を返している時にこのアルゴリズムを発見しました.文字列を探している時間の複雑さをnにするアルゴリズムです.
前にいくつかのブログを使って説明しましたが、いわゆるか分かりません.見れば見るほど目眩がします.実はアルゴリズムは簡単で、最初から最後までlen配列を求める過程です.
ここでこのブログを紹介します.このブログでこのアルゴリズムが分かります.https://blog.csdn.net/dyx404514/article/details/42061017)
注意する必要があるのは、菗号と数字0の位置に$を追加する理由です.
次にコードを貼ります.
前にいくつかのブログを使って説明しましたが、いわゆるか分かりません.見れば見るほど目眩がします.実はアルゴリズムは簡単で、最初から最後まで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