
关注
Manacher算法
【题目】
给定一个字符串str,返回str中的最长回文子串的长度。
【举例】
str=“123”。其中的最长回文子串“1”或者“2”或者“3”,所以返回1。
str=“abc1234321ab”。其中的最长回文子串“1234321”,所以返回7。
【进阶题目】
给定一个字符串str,想通过添加字符的方式使得str整体都变成回文字符串,但要求只能在str的末尾添加字符,请返回在str后面添加的最短字符串。
【举例】
str=“12”。在末尾添加“1”之后,str变为“121”是回文串。在末尾添加“21”之后,str变为“1221”也是回文串。但“1”是所有添加方案中最短的,所以返回“1”。
【要求】
如果str长度为N,解决原问题和进阶问题的时间复杂度都达到O(N)。
原问题代码:
public char[] manacherString(String str) {
char[] charArr = str.toCharArray();
char[] res = new char[str.length() * 2 + 1];
int index = 0;
for (int i = 0; i != res.length; i++) {
res[i] = (i & 1) == 0 ? '#' : charArr[index++];
}
return res;
}
public int maxLcpsLength(String str) {
if (str == null || str.length() == 0) {
return 0;
}
char[] charArr = manacherString(str);
int[] pArr = new int[charArr.length];
int index = -1;
int pR = -1;
int max = Integer.MIN_VALUE;
for (int i = 0; i != charArr.length; i++) {
pArr[i] = pR > i ? Math.min(pArr[2 * index - i], pR - i)
: 1;
while (i + pArr[i] < charArr.length && i -
pArr[i] > -1) {
if (charArr[i + pArr[i]] == charArr[i - pArr[i]])
pArr[i]++;
else {
break;
}
}
if (i + pArr[i] > pR) {
pR = i + pArr[i];
index = i;
}
max = Math.max(max, pArr[i]);
}
return max - 1;
}
进阶问题代码:
public String shortestEnd(String str) {
if (str == null || str.length() == 0) {
return null;
}
char[] charArr = manacherString(str);
int[] pArr = new int[charArr.length];
int index = -1;
int pR = -1;
int maxContainsEnd = -1;
for (int i = 0; i != charArr.length; i++) {
pArr[i] = pR > i ? Math.min(pArr[2 * index - i], pR - i)
: 1;
while (i + pArr[i] < charArr.length && i -
pArr[i] > -1) {
if (charArr[i + pArr[i]] == charArr[i - pArr[i]])
pArr[i]++;
else {
break;
}
}
if (i + pArr[i] > pR) {
pR = i + pArr[i];
index = i;
}
if (pR == charArr.length) {
maxContainsEnd = pArr[i];
break;
}
}
char[] res = new char[str.length() - maxContainsEnd + 1];
for (int i = 0; i < res.length; i++) {
res[res.length - 1 - i] = charArr[i * 2 + 1];
}
return String.valueOf(res);
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
04-15 23:42
中山大学 Java 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
- 1... 本科四段大厂实习,暑期五个offer,我的暑期结束了,秋招前集邮atmd、上海四毒2.9W
- 2... 一文讲清新手到底要不要写《苍穹外卖》和《黑马点评》?5742
- 3... 节后上班第一天,我的精神状态be like……5060
- 4... 黑马点评大总结4379
- 5... 轮子项目是什么意思3034
- 6... 实习/试用期转正,如何写好答辩文档?2936
- 7... Java后端5月还会有机会吗2912
- 8... 只有真正上战场了,才知道自己多菜!2729
- 9... 好未来 暑期后端一面2106
- 10... 拼多多PDD-5.5服务端研发实习生二面面经2018
正在热议
更多
# 你上一次加班是什么时候? #
49323次浏览 345人参与
# 学历or实习经历,哪个更重要 #
94868次浏览 683人参与
# 深信服求职进展汇总 #
177898次浏览 1663人参与
# 租房找室友 #
14476次浏览 101人参与
# 大疆求职进展汇总 #
478223次浏览 3191人参与
# 如何排解工作中的焦虑 #
149743次浏览 1750人参与
# 秋招签约后的心态变化 #
74050次浏览 790人参与
# 秋招最大的收获是什么? #
24349次浏览 275人参与
# 实习要如何选择和准备? #
55748次浏览 917人参与
# 秋招想进国企该如何准备 #
50309次浏览 350人参与
# 牛友打假中心 #
82489次浏览 2633人参与
# 摸鱼被leader发现了怎么办 #
49676次浏览 323人参与
# 找工作,行业重要还是岗位重要? #
27403次浏览 460人参与
# 生化医药面经大本营 #
99827次浏览 466人参与
# 你觉得通信/硬件有必要实习吗? #
99468次浏览 895人参与
# 多益网络求职进展汇总 #
21773次浏览 126人参与
# 如果可以,你希望哪个公司来捞你 #
70437次浏览 303人参与
# 潍柴工作体验 #
24603次浏览 18人参与
# 产品每日一题 #
38947次浏览 551人参与
# 实习工作,你找得还顺利吗? #
401054次浏览 5541人参与