生活随笔
收集整理的這篇文章主要介紹了
常考数据结构与算法-manacher算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
回文字符串123321
回文直徑:6
回文半徑:3
求一個字符串中的最長回文字符串. abc123321def
一般會在原字符串中添加特殊字符,比如添加"#".
變成#a#b#c#1#2#3#3#2#1#d#e#f#
public class Code_Manacher {public static void main(String[] args
) {System.out
.println(manacher("a"));}public static int manacher(String s
){if(null == s
|| s
.length() == 0){return 0;}char[] str
= manacherString(s
);int[] pArr
= new int[str
.length
];int C = -1;int R = -1; int max
= Integer.MIN_VALUE
;int end
= 0;for (int i
= 0; i
< str
.length
; i
++) {pArr
[i
] = R > i
? Math.min(pArr
[2*C-i
],R-i
) :1;while(i
+pArr
[i
]<str
.length
&& i
-pArr
[i
]>-1){if(str
[i
+pArr
[i
]] == str
[i
-pArr
[i
]]){pArr
[i
]++;}else{break;}}if(i
+pArr
[i
]>R){R = i
+pArr
[i
];C = i
;}if(max
< pArr
[i
]){max
= pArr
[i
];end
= R/2-1; }}
System.out
.println(end
);for (int i
= end
+2-max
; i
<=end
; i
++) {System.out
.printf("%c",s
.charAt(i
)); }System.out
.println();return max
-1; }public static char[] manacherString(String s
){char[] str
= new char[2*s
.length()+1];str
[0]='#';int j
= 1;for (int i
= 0; i
< s
.length(); i
++) {str
[j
++] = s
.charAt(i
);str
[j
++] = '#';}return str
;}
}
總結
以上是生活随笔為你收集整理的常考数据结构与算法-manacher算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。