关注
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-25 08:54
沈阳建筑大学 建筑类 点赞 评论 收藏
转发
不愿透露姓名的神秘牛友
04-17 08:35
已编辑
点赞 评论 收藏
转发
牛客热帖
正在热议
# 牛友的五一计划 #
13643次浏览 307人参与
# 如何看待offer收割机的行为 #
193431次浏览 2975人参与
# 牛客帮帮团来啦!有问必答 #
394805次浏览 7780人参与
# 晒一晒我的offer #
2819178次浏览 49872人参与
# 无实习如何秋招上岸 #
172179次浏览 2713人参与
# 如何一边实习一边秋招 #
200854次浏览 3989人参与
# 春招别灰心,我们一人来一句鼓励 #
21024次浏览 304人参与
# 非技术岗薪资爆料 #
8059次浏览 152人参与
# 硬件人的春招flag #
14516次浏览 199人参与
# 在国企工作的人,躺平了吗? #
72596次浏览 878人参与
# 女生做医疗销售有前景吗 #
3832次浏览 48人参与
# 第一次面试 #
16750次浏览 250人参与
# 来聊聊机械薪资天花板是哪家 #
22366次浏览 178人参与
# 机械人,你的秋招第一份简历被谁挂了 #
26920次浏览 491人参与
# 你更愿意参加线上面试还是线下面试? #
6845次浏览 94人参与
# 华为求职进展汇总 #
441184次浏览 4431人参与
# 机械制造2024笔面经 #
277775次浏览 4658人参与
# 没有实习经历,还有机会进大厂吗 #
257495次浏览 4840人参与
# 通信硬件薪资爆料 #
147592次浏览 1117人参与
# 简历中的项目经历要怎么写 #
380291次浏览 6390人参与