manacher算法的实现
发布时间:2020-12-16 07:45:31 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 //求字符串s中最大回文的长度,要求字符串s不包含字符‘#’ int manacher(const string s) { if (s.size() = 1) return s.size(); //往s每个字符之间以
以下代码由PHP站长网 52php.cn收集自互联网 现在PHP站长网小编把它分享给大家,仅供参考 //求字符串s中最大回文的长度,要求字符串s不包含字符‘#’ int manacher(const string &s) { if (s.size() <= 1) return s.size(); //往s每个字符之间以及s的首尾都插入‘#’ string str(s.size() * 2 + 1,'#'); for (int i = 0,j = 1; i<s.size(); ++i,j += 2) str[j] = s[i]; int maxr = 2,id = 1,size = str.size();//maxr是当前最大回文的半径 vector<int> p(size,1); p[1] = 2; for (int i = 2; i <= size-3; ++i) { int maxright = p[id] + id - 1; if (i>maxright) { while (i - p[i] >= 0 && i + p[i]<size && str[i + p[i]] == str[i - p[i]]) ++p[i]; } else { int idleft = id - p[id] + 1; int k = i - id,j = id - k,tmp = j - p[j] + 1;//i和j关于id对称 if (tmp>idleft) p[i] = p[j]; else if (tmp<idleft) p[i] = p[id] - k; else { p[i] = p[j]; while (i - p[i] >= 0 && i + p[i]<size && str[i + p[i]] == str[i - p[i]]) ++p[i]; } } if (p[i] + i>p[id] + id) id = i; maxr = max(maxr,p[i]); } return maxr - 1; } 以上内容由PHP站长网【52php.cn】收集整理供大家参考研究 如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |