中心拓展算法
- 枚举所有可能的回文中心,就考虑字符串是奇数还是偶数?
- 可以分奇数,偶数二次循环枚举:
int l = i, r = i // 奇数个字符,回文中心为单个字符。l = r 然后向二个方向扩展对比 while(s[l] >=0 && s[r] < n && s[l--] == s[r++]) ans++; int l = i, r = i // 偶数个字符,回文中心为二个字符。l = i, r = i+1 然后向二个方向扩展对比 while(s[l] >=0 && s[r] < n && s[l--] == s[r++]) ans++;
- 一个循环,n个字符串有2n-1个回文中心:
int l = i / 2, r = i / 2 + i % 2; while (l >= 0 && r < n && s[l--] == s[r++]) ans++;
int countSubstrings(char* s) { int n = strlen(s), ans = 0; for (int i = 0; i < 2 * n - 1; ++i) { int l = i / 2, r = i / 2 + i % 2; while (l >= 0 && r < n && s[l--] == s[r++]) { ++ans; } } return ans; }
附:马拉车算法详解---转载 https://ethsonliu.com/2018/04/manacher.html
-
文章作者:刘毅 (Ethson Liu)发布日期:2018-04-03原文链接:https://ethsonliu.com/2018/04/manacher.html版权声明:文章版权归本人所有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。