关注
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-28 20:30
北京航空航天大学 机械类 点赞 评论 收藏
转发
牛客热帖
- 1... 想来字节技术实习,看我这篇就够了!——保姆级面经大放送1.8W
- 2... 毕业1.2W
- 3... 25届第一份实习怎么找?1.1W
- 4... 【0429快问快答】99%牛油的疑惑解答(更新至38个问题1.1W
- 5... 0实习经验上岸字节,分享一下过程经验9433
- 6... 【奖】休息放松or学习提升,五一假期和牛牛一起“充充电”🔋7860
- 7... 准备去参加自己的婚礼6129
- 8... 美团后端日常实习一二面(已oc)5646
- 9... 为什么我不建议你学C++后端5204
- 10... 【薪资计算】SS Is All You Need4716
正在热议
# 牛友的五一计划 #
25444次浏览 458人参与
# 市场营销面经 #
1667次浏览 79人参与
# 牛客帮帮团来啦!有问必答 #
414750次浏览 7980人参与
# 晒一晒我的offer #
2855659次浏览 50169人参与
# 互联网公司评价 #
63586次浏览 904人参与
# 市场营销人求职交流聚集地 #
25463次浏览 577人参与
# 许愿池 #
67042次浏览 1486人参与
# 提前批真的不会影响正式批吗 #
18205次浏览 229人参与
# 我的上岸简历长这样 #
142671次浏览 2864人参与
# 如何看待offer收割机的行为 #
197482次浏览 3030人参与
# 国企和大厂硬件兄弟怎么选? #
28611次浏览 552人参与
# 非技术岗薪资爆料 #
10389次浏览 204人参与
# 实习想申请秋招offer,能不能argue薪资 #
4529次浏览 70人参与
# 找工作,你会甘心进小厂还是猛冲大厂 #
24810次浏览 246人参与
# 产品实习,你更倾向大公司or小公司 #
31546次浏览 496人参与
# 在国企工作的人,躺平了吗? #
74200次浏览 908人参与
# 浅聊一下我实习的辛苦费 #
71503次浏览 649人参与
# 简历中的项目经历要怎么写 #
383680次浏览 6435人参与
# 没有实习经历,还有机会进大厂吗 #
260661次浏览 4910人参与
# 机械制造薪资爆料 #
262925次浏览 3204人参与