关注
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);
}
查看原帖
点赞 评论
相关推荐
查看22道真题和解析 点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 在大厂上班是一种什么样的体验 #
11053次浏览 138人参与
# 你的mentor是什么样的人? #
50841次浏览 714人参与
# 程序员找工作至少要刷多少题? #
19089次浏览 249人参与
# 机械人避雷的岗位/公司 #
43589次浏览 300人参与
# 我现在比当时_,你想录用我吗 #
8840次浏览 111人参与
# 设计人如何选offer #
189499次浏览 868人参与
# 为了减少AI幻觉,你注入过哪些设定? #
4860次浏览 151人参与
# 你的秋招进行到哪一步了 #
2529864次浏览 23253人参与
# 机械人还在等华为开奖吗? #
311974次浏览 1582人参与
# 牛客AI体验站 #
6961次浏览 189人参与
# 重来一次,我还会选择这个专业吗 #
411058次浏览 3898人参与
# 12306一秒售罄,你抢到回家的票了吗? #
2024次浏览 48人参与
# 论秋招对个人心气的改变 #
11346次浏览 156人参与
# 一张图晒一下你的AI员工 #
5210次浏览 117人参与
# AI Coding的使用心得 #
4762次浏览 101人参与
# 我和mentor的爱恨情仇 #
105993次浏览 941人参与
# 刚入职的你踩过哪些坑 #
6989次浏览 128人参与
# 关于春招/暑期实习,你想知道哪些信息? #
7678次浏览 120人参与
# 应届生进小公司有什么影响吗 #
118334次浏览 1159人参与
# 晒晒你司的新年福利 #
8594次浏览 106人参与