Algorithm
shortest-palindrome
给定一个字符串s,在s前增加最少字符串使得回文
还是上一周的算法
KMP实现方法:
KMP算法分享主要计算每个索引位置,前缀最长重复字符串表(文中最后分享)
反转s为reverse,新字符串为s+"#"+reverse,找新字符串最后一位前缀匹配程度,即s前缀回文程度,只需要在s前补充反转字符串剩余不回文的部分
比如:
public String shortestPalindrome(String s) {
StringBuilder reverse = new StringBuilder(s).reverse();
// reverse = abcbabcaba
// newStr = reverse+"#" + s 即abcbabcaba#abacbabcba
// 找newStr最后一位和前缀匹配程度,即s前缀的回文程度,需要补充的字符串为出去回文字符串剩余的反转字符串
String newStr = s + "#" + reverse;
int[] f = calculateTable(newStr);
for (int item : f) {
System.out.print(item);
}
System.out.println();
return reverse.substring(0, s.length() - f[newStr.length() - 1]) + s;
}
public int[] calculateTable(String subStr) {
// 计算table
int[] f = new int[subStr.length()];
f[0] = 0;
int t = 0;
char temp;
for (int i = 1; i < subStr.length(); i++) {
temp = subStr.charAt(i);
if (temp == subStr.charAt(t)) {
f[i] = ++t;
} else {
while (t > 0) {
// 假设到b不匹配,b之前匹配度为caca即t,t=4
// 拿caca继续找匹配度(索引从0开始)t=f[t-1]=f[3]=2,s[t]=s[2]=c≠b
// 拿ca继续找t=f[t-1]=f[1]=0匹配度为0结束
t = f[t - 1];
if (t > 0) {
if (temp == subStr.charAt(t)) {
f[i] = ++t;
break;
}
}
}
}
}
return f;
}
Review
distributed-system-microservices
提出了一些微服务基本的一些优缺点
Tips
无
网友评论