Skip to content

Commit f9c15f7

Browse files
committed
feat: add solutions to lc problem: No.0214
No.0214.Shortest Palindrome
1 parent 7425540 commit f9c15f7

File tree

8 files changed

+281
-2
lines changed

8 files changed

+281
-2
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
- [和至少为 K 的最短子数组](/solution/0800-0899/0862.Shortest%20Subarray%20with%20Sum%20at%20Least%20K/README.md) - `单调队列`
6262
- [带限制的子序列和](/solution/1400-1499/1425.Constrained%20Subsequence%20Sum/README.md) - `动态规划``单调队列优化`
6363
- [单词规律 II](/solution/0200-0299/0291.Word%20Pattern%20II/README.md) - `哈希表``回溯`
64+
- [最短回文串](/solution/0200-0299/0214.Shortest%20Palindrome/README.md) - `字符串哈希`
6465

6566
### 3. 搜索
6667

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
5959
- [Shortest Subarray with Sum at Least K](/solution/0800-0899/0862.Shortest%20Subarray%20with%20Sum%20at%20Least%20K/README_EN.md) - `Monotonic Queue`
6060
- [Constrained Subsequence Sum](/solution/1400-1499/1425.Constrained%20Subsequence%20Sum/README_EN.md) - `Dynamic Programming`, `Monotonic Queue`
6161
- [Word Pattern II](/solution/0200-0299/0291.Word%20Pattern%20II/README_EN.md) - `Hash Table``Backtracking`
62+
- [Shortest Palindrome](/solution/0200-0299/0214.Shortest%20Palindrome/README_EN.md) - `Rabin-Karp`
6263

6364
### 3. Search
6465

solution/0200-0299/0214.Shortest Palindrome/README.md

+100-1
Original file line numberDiff line numberDiff line change
@@ -37,22 +37,121 @@
3737

3838
<!-- 这里可写通用的实现逻辑 -->
3939

40+
**方法一:字符串哈希**
41+
42+
问题等价于**找到字符串 s 的最长回文前缀**
43+
44+
记 s 的长度为 n,其最长回文前缀的长度为 m,将 s 的后 n-m 个字符反序并添加到 s 的前面即可构成最短回文串。
45+
4046
<!-- tabs:start -->
4147

4248
### **Python3**
4349

4450
<!-- 这里可写当前语言的特殊实现逻辑 -->
4551

4652
```python
47-
53+
class Solution:
54+
def shortestPalindrome(self, s: str) -> str:
55+
base = 131
56+
mod = 10**9 + 7
57+
n = len(s)
58+
prefix = suffix = 0
59+
mul = 1
60+
idx = 0
61+
for i, c in enumerate(s):
62+
prefix = (prefix * base + (ord(c) - ord('a') + 1)) % mod
63+
suffix = (suffix + (ord(c) - ord('a') + 1) * mul) % mod
64+
mul = (mul * base) % mod
65+
if prefix == suffix:
66+
idx = i + 1
67+
return s if idx == n else s[idx:][::-1] + s
4868
```
4969

5070
### **Java**
5171

5272
<!-- 这里可写当前语言的特殊实现逻辑 -->
5373

5474
```java
75+
class Solution {
76+
public String shortestPalindrome(String s) {
77+
int base = 131;
78+
int mul = 1;
79+
int mod = (int) 1e9 + 7;
80+
int prefix = 0, suffix = 0;
81+
int idx = 0;
82+
int n = s.length();
83+
for (int i = 0; i < n; ++i) {
84+
int t = s.charAt(i) - 'a' + 1;
85+
prefix = (int) (((long) prefix * base + t) % mod);
86+
suffix = (int) ((suffix + (long) t * mul) % mod);
87+
mul = (int) (((long) mul * base) % mod);
88+
if (prefix == suffix) {
89+
idx = i + 1;
90+
}
91+
}
92+
if (idx == n) {
93+
return s;
94+
}
95+
return new StringBuilder(s.substring(idx)).reverse().toString() + s;
96+
}
97+
}
98+
```
99+
100+
### **C++**
101+
102+
```cpp
103+
typedef unsigned long long ull;
104+
105+
class Solution {
106+
public:
107+
string shortestPalindrome(string s) {
108+
int base = 131;
109+
ull mul = 1;
110+
ull prefix = 0;
111+
ull suffix = 0;
112+
int idx = 0, n = s.size();
113+
for (int i = 0; i < n; ++i)
114+
{
115+
int t = s[i] - 'a' + 1;
116+
prefix = prefix * base + t;
117+
suffix = suffix + mul * t;
118+
mul *= base;
119+
if (prefix == suffix) idx = i + 1;
120+
}
121+
if (idx == n) return s;
122+
string x = s.substr(idx, n - idx);
123+
reverse(x.begin(), x.end());
124+
return x + s;
125+
}
126+
};
127+
```
55128
129+
### **Go**
130+
131+
```go
132+
func shortestPalindrome(s string) string {
133+
n := len(s)
134+
base, mod := 131, int(1e9)+7
135+
prefix, suffix, mul := 0, 0, 1
136+
idx := 0
137+
for i, c := range s {
138+
t := int(c-'a') + 1
139+
prefix = (prefix*base + t) % mod
140+
suffix = (suffix + t*mul) % mod
141+
mul = (mul * base) % mod
142+
if prefix == suffix {
143+
idx = i + 1
144+
}
145+
}
146+
if idx == n {
147+
return s
148+
}
149+
x := []byte(s[idx:])
150+
for i, j := 0, len(x)-1; i < j; i, j = i+1, j-1 {
151+
x[i], x[j] = x[j], x[i]
152+
}
153+
return string(x) + s
154+
}
56155
```
57156

58157
### **...**

solution/0200-0299/0214.Shortest Palindrome/README_EN.md

+94-1
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,106 @@
3131
### **Python3**
3232

3333
```python
34-
34+
class Solution:
35+
def shortestPalindrome(self, s: str) -> str:
36+
base = 131
37+
mod = 10**9 + 7
38+
n = len(s)
39+
prefix = suffix = 0
40+
mul = 1
41+
idx = 0
42+
for i, c in enumerate(s):
43+
prefix = (prefix * base + (ord(c) - ord('a') + 1)) % mod
44+
suffix = (suffix + (ord(c) - ord('a') + 1) * mul) % mod
45+
mul = (mul * base) % mod
46+
if prefix == suffix:
47+
idx = i + 1
48+
return s if idx == n else s[idx:][::-1] + s
3549
```
3650

3751
### **Java**
3852

3953
```java
54+
class Solution {
55+
public String shortestPalindrome(String s) {
56+
int base = 131;
57+
int mul = 1;
58+
int mod = (int) 1e9 + 7;
59+
int prefix = 0, suffix = 0;
60+
int idx = 0;
61+
int n = s.length();
62+
for (int i = 0; i < n; ++i) {
63+
int t = s.charAt(i) - 'a' + 1;
64+
prefix = (int) (((long) prefix * base + t) % mod);
65+
suffix = (int) ((suffix + (long) t * mul) % mod);
66+
mul = (int) (((long) mul * base) % mod);
67+
if (prefix == suffix) {
68+
idx = i + 1;
69+
}
70+
}
71+
if (idx == n) {
72+
return s;
73+
}
74+
return new StringBuilder(s.substring(idx)).reverse().toString() + s;
75+
}
76+
}
77+
```
78+
79+
### **C++**
80+
81+
```cpp
82+
typedef unsigned long long ull;
83+
84+
class Solution {
85+
public:
86+
string shortestPalindrome(string s) {
87+
int base = 131;
88+
ull mul = 1;
89+
ull prefix = 0;
90+
ull suffix = 0;
91+
int idx = 0, n = s.size();
92+
for (int i = 0; i < n; ++i)
93+
{
94+
int t = s[i] - 'a' + 1;
95+
prefix = prefix * base + t;
96+
suffix = suffix + mul * t;
97+
mul *= base;
98+
if (prefix == suffix) idx = i + 1;
99+
}
100+
if (idx == n) return s;
101+
string x = s.substr(idx, n - idx);
102+
reverse(x.begin(), x.end());
103+
return x + s;
104+
}
105+
};
106+
```
40107
108+
### **Go**
109+
110+
```go
111+
func shortestPalindrome(s string) string {
112+
n := len(s)
113+
base, mod := 131, int(1e9)+7
114+
prefix, suffix, mul := 0, 0, 1
115+
idx := 0
116+
for i, c := range s {
117+
t := int(c-'a') + 1
118+
prefix = (prefix*base + t) % mod
119+
suffix = (suffix + t*mul) % mod
120+
mul = (mul * base) % mod
121+
if prefix == suffix {
122+
idx = i + 1
123+
}
124+
}
125+
if idx == n {
126+
return s
127+
}
128+
x := []byte(s[idx:])
129+
for i, j := 0, len(x)-1; i < j; i, j = i+1, j-1 {
130+
x[i], x[j] = x[j], x[i]
131+
}
132+
return string(x) + s
133+
}
41134
```
42135

43136
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
typedef unsigned long long ull;
2+
3+
class Solution {
4+
public:
5+
string shortestPalindrome(string s) {
6+
int base = 131;
7+
ull mul = 1;
8+
ull prefix = 0;
9+
ull suffix = 0;
10+
int idx = 0, n = s.size();
11+
for (int i = 0; i < n; ++i)
12+
{
13+
int t = s[i] - 'a' + 1;
14+
prefix = prefix * base + t;
15+
suffix = suffix + mul * t;
16+
mul *= base;
17+
if (prefix == suffix) idx = i + 1;
18+
}
19+
if (idx == n) return s;
20+
string x = s.substr(idx, n - idx);
21+
reverse(x.begin(), x.end());
22+
return x + s;
23+
}
24+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func shortestPalindrome(s string) string {
2+
n := len(s)
3+
base, mod := 131, int(1e9)+7
4+
prefix, suffix, mul := 0, 0, 1
5+
idx := 0
6+
for i, c := range s {
7+
t := int(c-'a') + 1
8+
prefix = (prefix*base + t) % mod
9+
suffix = (suffix + t*mul) % mod
10+
mul = (mul * base) % mod
11+
if prefix == suffix {
12+
idx = i + 1
13+
}
14+
}
15+
if idx == n {
16+
return s
17+
}
18+
x := []byte(s[idx:])
19+
for i, j := 0, len(x)-1; i < j; i, j = i+1, j-1 {
20+
x[i], x[j] = x[j], x[i]
21+
}
22+
return string(x) + s
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public String shortestPalindrome(String s) {
3+
int base = 131;
4+
int mul = 1;
5+
int mod = (int) 1e9 + 7;
6+
int prefix = 0, suffix = 0;
7+
int idx = 0;
8+
int n = s.length();
9+
for (int i = 0; i < n; ++i) {
10+
int t = s.charAt(i) - 'a' + 1;
11+
prefix = (int) (((long) prefix * base + t) % mod);
12+
suffix = (int) ((suffix + (long) t * mul) % mod);
13+
mul = (int) (((long) mul * base) % mod);
14+
if (prefix == suffix) {
15+
idx = i + 1;
16+
}
17+
}
18+
if (idx == n) {
19+
return s;
20+
}
21+
return new StringBuilder(s.substring(idx)).reverse().toString() + s;
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution:
2+
def shortestPalindrome(self, s: str) -> str:
3+
base = 131
4+
mod = 10**9 + 7
5+
n = len(s)
6+
prefix = suffix = 0
7+
mul = 1
8+
idx = 0
9+
for i, c in enumerate(s):
10+
prefix = (prefix * base + (ord(c) - ord('a') + 1)) % mod
11+
suffix = (suffix + (ord(c) - ord('a') + 1) * mul) % mod
12+
mul = (mul * base) % mod
13+
if prefix == suffix:
14+
idx = i + 1
15+
return s if idx == n else s[idx:][::-1] + s

0 commit comments

Comments
 (0)