Manacher

最长回文子串与Manacher算法

隐身守侯 提交于 2019-12-07 04:19:02
题目描述 给定一个字符串,求它的最长回文子串的长度。 最简单粗暴的方法就是,枚举全部的字符串,然后每个都判断一下是不是回文,然后得到长度最长的字符串。显然,这个方法是可行的,可是也是效率极其低下的。 聪明一点的办法是枚举以每个字符作为中心,然后向两边扩展的字符串 例如字符串abcba: 以a为中心扩展,则最大回文长度为1 以b为中心扩展,因为a!=c,所以,最大回文长度也是1 以c为中心,有b==b,a==a,最大回文长度是5 ...... 得到最大回文长度是5 int LongestPalindrome(const char * s, int n) { int i, j, max, c; if (s == NULL || n < 1) { return 0; } max = 0; for(i = 0; i < n; i++) { for(j = 0; (i - j >= 0) && (i+j < n); j++) { if (s[i - j] != s[i + j]) break; c = j * 2 + 1; } if (c > max) max = c; for(j = 0; (i - j >= 0) && (i + j + 1 < n); j++) { if (s[i - j] != s[i + j + 1]) break; c = j * 2 + 2; } if (c >

【算法系列 四】 String

五迷三道 提交于 2019-12-06 21:42:47
1. 字符串循环左移( 九度OJ1362 ),要求时间复杂度O(N),空间复杂度O(1) 这是一道基本的题目,简单说来就是三次翻转 比如:abcdef 左移两位 cdefab 过程: ab 翻转 ba cdef 翻转 fedc 将上面两个翻转后的结果拼接 bafedc 再翻转cdefab得到结果 代码: import java.io.IOException; import java.util.Scanner; public class Main { public static void main(String[] args) throws IOException { Scanner cin = new Scanner(System.in); int N; String str; while (cin.hasNext()) { str = cin.next(); N = cin.nextInt(); N = N % str.length(); String a = str.substring(0, N); String b = str.substring(N); StringBuffer abuffer = new StringBuffer(a); StringBuffer bbuffer = new StringBuffer(b); StringBuffer areverse =