思维类型题OJ篇
2、 最短回文串
难度:困难 类型: 字符串
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例1
输入: “aacecaaa”
输出: “aaacecaaa”
示例2
输入: “abcd”
输出: “dcbabcd”
方法一:创建原字符串 ss 的反转,记为 rev,这将用于从字符串开头找到最大的回文子串,寻找更大的回文子串一旦得到最大的回文子串,就可以返回结果
string shortestPalindrome(string s){
int n = s.size();
string rev(s);
reverse(rev.begin(), rev.end());
int j = 0;
for (int i = 0; i < n; i++) {
if (s.substr(0, n - i) == rev.substr(i))
return rev.substr(0, i) + s;
}
return "";
}
方法二:KMP 字符串匹配算法
string shortestPalindrome(string s) {
int n = s.size();
string r = s;
reverse(r.begin(), r.end());
string str = s + "#" + r;
vector<int> next(2 * n + 2);
getNext(str, next);
return r.substr(0, n - next[2 * n + 1]) + s;
}
void getNext(string& str, vector<int>& next) {
next[0] = -1;
int i = 0, j = -1;
while (i < str.size()) {
if (j == -1 || str[i] == str[j]) {
next[++i] = ++j;
}
else j = next[j];
}
}
方法三:startswith 判断参数字符是否是指定字符串的开头,开头
的概念默认是参数字符的长度,另外参数字符也可以指定范围。
def shortestPalindrome(s):
r = s[::-1]
for i in range(len(s) + 1):
# startswith() 方法用于
# 检查字符串是否是以指定子字符串开头
# 如果是则返回 True,否则返回 False
if s.startswith(r[i:])