class Solution {
public:
string shortestPalindrome(string s) {
}
};
214. 最短回文串
给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。
示例 1:
输入:s = "aacecaaa" 输出:"aaacecaaa"
示例 2:
输入:s = "abcd" 输出:"dcbabcd"
提示:
0 <= s.length <= 5 * 104
s
仅由小写英文字母组成原站题解
golang 解法, 执行用时: 0 ms, 内存消耗: 3.7 MB, 提交时间: 2023-09-23 12:00:46
func shortestPalindrome(s string) string { n := len(s) base, mod := 131, 1000000007 left, right, mul := 0, 0, 1 best := -1 for i := 0; i < n; i++ { left = (left * base + int(s[i] - '0')) % mod right = (right + mul * int(s[i] - '0')) % mod if left == right { best = i } mul = mul * base % mod } add := "" if best != n - 1 { add = s[best + 1:] } b := []byte(add) for i := 0; i < len(b) / 2; i++ { b[i], b[len(b) - 1 -i] = b[len(b) - 1 -i], b[i] } return string(b) + s } // kmp func shortestPalindrome2(s string) string { n := len(s) fail := make([]int, n) for i := 0; i < n; i++ { fail[i] = -1 } for i := 1; i < n; i++ { j := fail[i - 1] for j != -1 && s[j + 1] != s[i] { j = fail[j] } if s[j + 1] == s[i] { fail[i] = j + 1 } } best := -1 for i := n - 1; i >= 0; i-- { for best != -1 && s[best + 1] != s[i] { best = fail[best] } if s[best + 1] == s[i] { best++ } } add := "" if best != n - 1 { add = s[best + 1:] } b := []byte(add) for i := 0; i < len(b) / 2; i++ { b[i], b[len(b) - 1 -i] = b[len(b) - 1 -i], b[i] } return string(b) + s }
python3 解法, 执行用时: 92 ms, 内存消耗: 18.3 MB, 提交时间: 2023-09-23 12:00:15
class Solution: def shortestPalindrome1(self, s: str) -> str: n = len(s) base, mod = 131, 10**9 + 7 left = right = 0 mul = 1 best = -1 for i in range(n): left = (left * base + ord(s[i])) % mod right = (right + mul * ord(s[i])) % mod if left == right: best = i mul = mul * base % mod add = ("" if best == n - 1 else s[best+1:]) return add[::-1] + s # kmp def shortestPalindrome(self, s: str) -> str: n = len(s) fail = [-1] * n for i in range(1, n): j = fail[i - 1] while j != -1 and s[j + 1] != s[i]: j = fail[j] if s[j + 1] == s[i]: fail[i] = j + 1 best = -1 for i in range(n - 1, -1, -1): while best != -1 and s[best + 1] != s[i]: best = fail[best] if s[best + 1] == s[i]: best += 1 add = ("" if best == n - 1 else s[best+1:]) return add[::-1] + s
java 解法, 执行用时: 4 ms, 内存消耗: 42.5 MB, 提交时间: 2023-09-23 11:59:37
class Solution { // hash public String shortestPalindrome2(String s) { int n = s.length(); int base = 131, mod = 1000000007; int left = 0, right = 0, mul = 1; int best = -1; for (int i = 0; i < n; ++i) { left = (int) (((long) left * base + s.charAt(i)) % mod); right = (int) ((right + (long) mul * s.charAt(i)) % mod); if (left == right) { best = i; } mul = (int) ((long) mul * base % mod); } String add = (best == n - 1 ? "" : s.substring(best + 1)); StringBuffer ans = new StringBuffer(add).reverse(); ans.append(s); return ans.toString(); } // kmp public String shortestPalindrome(String s) { int n = s.length(); int[] fail = new int[n]; Arrays.fill(fail, -1); for (int i = 1; i < n; ++i) { int j = fail[i - 1]; while (j != -1 && s.charAt(j + 1) != s.charAt(i)) { j = fail[j]; } if (s.charAt(j + 1) == s.charAt(i)) { fail[i] = j + 1; } } int best = -1; for (int i = n - 1; i >= 0; --i) { while (best != -1 && s.charAt(best + 1) != s.charAt(i)) { best = fail[best]; } if (s.charAt(best + 1) == s.charAt(i)) { ++best; } } String add = (best == n - 1 ? "" : s.substring(best + 1)); StringBuffer ans = new StringBuffer(add).reverse(); ans.append(s); return ans.toString(); } }
cpp 解法, 执行用时: 4 ms, 内存消耗: 8.1 MB, 提交时间: 2023-09-23 11:58:49
class Solution { public: // 字符串哈希 string shortestPalindrome(string s) { int n = s.size(); int base = 131, mod = 1000000007; int left = 0, right = 0, mul = 1; int best = -1; for (int i = 0; i < n; ++i) { left = ((long long)left * base + s[i]) % mod; right = (right + (long long)mul * s[i]) % mod; if (left == right) { best = i; } mul = (long long)mul * base % mod; } string add = (best == n - 1 ? "" : s.substr(best + 1, n)); reverse(add.begin(), add.end()); return add + s; } // kmp string shortestPalindrome2(string s) { int n = s.size(); int base = 131, mod = 1000000007; int left = 0, right = 0, mul = 1; int best = -1; for (int i = 0; i < n; ++i) { left = ((long long)left * base + s[i]) % mod; right = (right + (long long)mul * s[i]) % mod; if (left == right) { best = i; } mul = (long long)mul * base % mod; } string add = (best == n - 1 ? "" : s.substr(best + 1, n)); reverse(add.begin(), add.end()); return add + s; } };