5. 最长回文子串
用的Manacher
class Solution { public: string init(string s) { string str = "$"; int len = s.length(); for(int i = 0; i < len; i++) str += "#", str += s[i]; str += "#"; return str; } string Manacher(string s) { int p[2010]; string str = init(s); int n = str.length(); int mx = 1, id, maxLen = 1, k = 2; for(int i = 1; i < n; i++) { if(i < mx) { p[i] = min(mx - i, p[id * 2 - i]); } else p[i] = 1; while(i + p[i] < n && str[i - p[i]] == str[i + p[i]]) p[i]++; if(mx < i + p[i]) mx = i + p[i], id = i; if(p[i] > maxLen) { maxLen = p[i]; k = i; } } string ret1 = "", ret2 = ""; int j = 0; while(j < maxLen) { if(str[k + j] != '#') ret1 += str[k + j]; j++; } ret2 = ret1; reverse(ret1.begin(), ret1.end()); j = 1; while(j < maxLen) { if(str[k - j] != '#') ret1 += str[k - j]; j++; } return ret1; } string longestPalindrome(string s) { string ret = Manacher(s); return ret; } };
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。