leetcode214. 最短回文串

举报
兔老大 发表于 2021/04/23 00:06:20 2021/04/23
【摘要】 214. 最短回文串 难度困难114 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 1: 输入: "aacecaaa" 输出: "aaacecaaa" 示例 2: 输入: "abcd" 输出: "dcbabcd" 思路:马拉车求出以0开头的最大回文串,然后在前面添加后面...

214. 最短回文串

难度困难114

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。

示例 1:

输入: "aacecaaa"
输出: "aaacecaaa"

 

示例 2:

输入: "abcd"
输出: "dcbabcd"
 

思路:马拉车求出以0开头的最大回文串,然后在前面添加后面字符串的翻转即可。

傻子都能看懂的马拉车Manacher


  
  1. class Solution {
  2. public String preProcess(String s) {
  3. int n = s.length();
  4. if (n == 0) {
  5. return "^$";
  6. }
  7. String ret = "^";
  8. for (int i = 0; i < n; i++)
  9. ret += "#" + s.charAt(i);
  10. ret += "#$";
  11. return ret;
  12. }
  13. // 马拉车算法
  14. public String shortestPalindrome(String s) {
  15. String T = preProcess(s);
  16. int n = T.length();
  17. int[] P = new int[n];
  18. int C = 0, R = 0;
  19. for (int i = 1; i < n - 1; i++) {
  20. int i_mirror = 2 * C - i;
  21. if (R > i) {
  22. P[i] = Math.min(R - i, P[i_mirror]);// 防止超出 R
  23. } else {
  24. P[i] = 0;// 等于 R 的情况
  25. }
  26. // 碰到之前讲的三种情况时候,需要利用中心扩展法
  27. while (T.charAt(i + 1 + P[i]) == T.charAt(i - 1 - P[i])) {
  28. P[i]++;
  29. }
  30. // 判断是否需要更新 R
  31. if (i + P[i] > R) {
  32. C = i;
  33. R = i + P[i];
  34. }
  35. }
  36. //这里的话需要修改
  37. int maxLen = 0;
  38. int centerIndex = 0;
  39. for (int i = 1; i < n - 1; i++) {
  40. int start = (i - P[i]) / 2;
  41. //我们要判断当前回文串是不是开头是不是从 0 开始的
  42. if (start == 0) {
  43. maxLen = P[i] > maxLen ? P[i] : maxLen;
  44. }
  45. }
  46. return new StringBuilder(s.substring(maxLen)).reverse() + s;
  47. }
  48. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104368047

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。