Skip to content

Commit 8d83961

Browse files
committed
feat: add solutions to lc problem: No.0336
No.0336.Palindrome Pairs
1 parent bb18300 commit 8d83961

File tree

6 files changed

+258
-0
lines changed

6 files changed

+258
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
- [带限制的子序列和](/solution/1400-1499/1425.Constrained%20Subsequence%20Sum/README.md) - `动态规划``单调队列优化`
6363
- [单词规律 II](/solution/0200-0299/0291.Word%20Pattern%20II/README.md) - `哈希表``回溯`
6464
- [最短回文串](/solution/0200-0299/0214.Shortest%20Palindrome/README.md) - `字符串哈希`
65+
- [回文对](/solution/0300-0399/0336.Palindrome%20Pairs/README.md) - `字符串哈希`
6566

6667
### 3. 搜索
6768

README_EN.md

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
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`
6262
- [Shortest Palindrome](/solution/0200-0299/0214.Shortest%20Palindrome/README_EN.md) - `Rabin-Karp`
63+
- [Palindrome Pairs](/solution/0300-0399/0336.Palindrome%20Pairs/README_EN.md)) - `Rabin-Karp`
6364

6465
### 3. Search
6566

solution/0300-0399/0336.Palindrome Pairs/README.md

+88
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444

4545
<!-- 这里可写通用的实现逻辑 -->
4646

47+
**方法一:字符串哈希**
48+
4749
<!-- tabs:start -->
4850

4951
### **Python3**
@@ -59,7 +61,93 @@
5961
<!-- 这里可写当前语言的特殊实现逻辑 -->
6062

6163
```java
64+
class Solution {
65+
private static final int BASE = 131;
66+
private static final long[] MUL = new long[310];
67+
private static final int MOD = (int) 1e9 + 7;
68+
static {
69+
MUL[0] = 1;
70+
for (int i = 1; i < MUL.length; ++i) {
71+
MUL[i] = (MUL[i - 1] * BASE) % MOD;
72+
}
73+
}
74+
public List<List<Integer>> palindromePairs(String[] words) {
75+
int n = words.length;
76+
long[] prefix = new long[n];
77+
long[] suffix = new long[n];
78+
for (int i = 0; i < n; ++i) {
79+
String word = words[i];
80+
int m = word.length();
81+
for (int j = 0; j < m; ++j) {
82+
int t = word.charAt(j) - 'a' + 1;
83+
int s = word.charAt(m - j - 1) - 'a' + 1;
84+
prefix[i] = (prefix[i] * BASE) % MOD + t;
85+
suffix[i] = (suffix[i] * BASE) % MOD + s;
86+
}
87+
}
88+
List<List<Integer>> ans = new ArrayList<>();
89+
for (int i = 0; i < n; ++i) {
90+
for (int j = i + 1; j < n; ++j) {
91+
if (check(i, j, words[j].length(), words[i].length(), prefix, suffix)) {
92+
ans.add(Arrays.asList(i, j));
93+
}
94+
if (check(j, i, words[i].length(), words[j].length(), prefix, suffix)) {
95+
ans.add(Arrays.asList(j, i));
96+
}
97+
}
98+
}
99+
return ans;
100+
}
101+
102+
private boolean check(int i, int j, int n, int m, long[] prefix, long[] suffix) {
103+
long t = ((prefix[i] * MUL[n]) % MOD + prefix[j]) % MOD;
104+
long s = ((suffix[j] * MUL[m]) % MOD + suffix[i]) % MOD;
105+
return t == s;
106+
}
107+
}
108+
```
62109

110+
### **Go**
111+
112+
```go
113+
func palindromePairs(words []string) [][]int {
114+
base := 131
115+
mod := int(1e9) + 7
116+
mul := make([]int, 310)
117+
mul[0] = 1
118+
for i := 1; i < len(mul); i++ {
119+
mul[i] = (mul[i-1] * base) % mod
120+
}
121+
n := len(words)
122+
prefix := make([]int, n)
123+
suffix := make([]int, n)
124+
for i, word := range words {
125+
m := len(word)
126+
for j, c := range word {
127+
t := int(c-'a') + 1
128+
s := int(word[m-j-1]-'a') + 1
129+
prefix[i] = (prefix[i]*base)%mod + t
130+
suffix[i] = (suffix[i]*base)%mod + s
131+
}
132+
}
133+
check := func(i, j, n, m int) bool {
134+
t := ((prefix[i]*mul[n])%mod + prefix[j]) % mod
135+
s := ((suffix[j]*mul[m])%mod + suffix[i]) % mod
136+
return t == s
137+
}
138+
var ans [][]int
139+
for i := 0; i < n; i++ {
140+
for j := i + 1; j < n; j++ {
141+
if check(i, j, len(words[j]), len(words[i])) {
142+
ans = append(ans, []int{i, j})
143+
}
144+
if check(j, i, len(words[i]), len(words[j])) {
145+
ans = append(ans, []int{j, i})
146+
}
147+
}
148+
}
149+
return ans
150+
}
63151
```
64152

65153
### **...**

solution/0300-0399/0336.Palindrome Pairs/README_EN.md

+86
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,93 @@
5252
### **Java**
5353

5454
```java
55+
class Solution {
56+
private static final int BASE = 131;
57+
private static final long[] MUL = new long[310];
58+
private static final int MOD = (int) 1e9 + 7;
59+
static {
60+
MUL[0] = 1;
61+
for (int i = 1; i < MUL.length; ++i) {
62+
MUL[i] = (MUL[i - 1] * BASE) % MOD;
63+
}
64+
}
65+
public List<List<Integer>> palindromePairs(String[] words) {
66+
int n = words.length;
67+
long[] prefix = new long[n];
68+
long[] suffix = new long[n];
69+
for (int i = 0; i < n; ++i) {
70+
String word = words[i];
71+
int m = word.length();
72+
for (int j = 0; j < m; ++j) {
73+
int t = word.charAt(j) - 'a' + 1;
74+
int s = word.charAt(m - j - 1) - 'a' + 1;
75+
prefix[i] = (prefix[i] * BASE) % MOD + t;
76+
suffix[i] = (suffix[i] * BASE) % MOD + s;
77+
}
78+
}
79+
List<List<Integer>> ans = new ArrayList<>();
80+
for (int i = 0; i < n; ++i) {
81+
for (int j = i + 1; j < n; ++j) {
82+
if (check(i, j, words[j].length(), words[i].length(), prefix, suffix)) {
83+
ans.add(Arrays.asList(i, j));
84+
}
85+
if (check(j, i, words[i].length(), words[j].length(), prefix, suffix)) {
86+
ans.add(Arrays.asList(j, i));
87+
}
88+
}
89+
}
90+
return ans;
91+
}
92+
93+
private boolean check(int i, int j, int n, int m, long[] prefix, long[] suffix) {
94+
long t = ((prefix[i] * MUL[n]) % MOD + prefix[j]) % MOD;
95+
long s = ((suffix[j] * MUL[m]) % MOD + suffix[i]) % MOD;
96+
return t == s;
97+
}
98+
}
99+
```
55100

101+
### **Go**
102+
103+
```go
104+
func palindromePairs(words []string) [][]int {
105+
base := 131
106+
mod := int(1e9) + 7
107+
mul := make([]int, 310)
108+
mul[0] = 1
109+
for i := 1; i < len(mul); i++ {
110+
mul[i] = (mul[i-1] * base) % mod
111+
}
112+
n := len(words)
113+
prefix := make([]int, n)
114+
suffix := make([]int, n)
115+
for i, word := range words {
116+
m := len(word)
117+
for j, c := range word {
118+
t := int(c-'a') + 1
119+
s := int(word[m-j-1]-'a') + 1
120+
prefix[i] = (prefix[i]*base)%mod + t
121+
suffix[i] = (suffix[i]*base)%mod + s
122+
}
123+
}
124+
check := func(i, j, n, m int) bool {
125+
t := ((prefix[i]*mul[n])%mod + prefix[j]) % mod
126+
s := ((suffix[j]*mul[m])%mod + suffix[i]) % mod
127+
return t == s
128+
}
129+
var ans [][]int
130+
for i := 0; i < n; i++ {
131+
for j := i + 1; j < n; j++ {
132+
if check(i, j, len(words[j]), len(words[i])) {
133+
ans = append(ans, []int{i, j})
134+
}
135+
if check(j, i, len(words[i]), len(words[j])) {
136+
ans = append(ans, []int{j, i})
137+
}
138+
}
139+
}
140+
return ans
141+
}
56142
```
57143

58144
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
func palindromePairs(words []string) [][]int {
2+
base := 131
3+
mod := int(1e9) + 7
4+
mul := make([]int, 310)
5+
mul[0] = 1
6+
for i := 1; i < len(mul); i++ {
7+
mul[i] = (mul[i-1] * base) % mod
8+
}
9+
n := len(words)
10+
prefix := make([]int, n)
11+
suffix := make([]int, n)
12+
for i, word := range words {
13+
m := len(word)
14+
for j, c := range word {
15+
t := int(c-'a') + 1
16+
s := int(word[m-j-1]-'a') + 1
17+
prefix[i] = (prefix[i]*base)%mod + t
18+
suffix[i] = (suffix[i]*base)%mod + s
19+
}
20+
}
21+
check := func(i, j, n, m int) bool {
22+
t := ((prefix[i]*mul[n])%mod + prefix[j]) % mod
23+
s := ((suffix[j]*mul[m])%mod + suffix[i]) % mod
24+
return t == s
25+
}
26+
var ans [][]int
27+
for i := 0; i < n; i++ {
28+
for j := i + 1; j < n; j++ {
29+
if check(i, j, len(words[j]), len(words[i])) {
30+
ans = append(ans, []int{i, j})
31+
}
32+
if check(j, i, len(words[i]), len(words[j])) {
33+
ans = append(ans, []int{j, i})
34+
}
35+
}
36+
}
37+
return ans
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
class Solution {
2+
private static final int BASE = 131;
3+
private static final long[] MUL = new long[310];
4+
private static final int MOD = (int) 1e9 + 7;
5+
static {
6+
MUL[0] = 1;
7+
for (int i = 1; i < MUL.length; ++i) {
8+
MUL[i] = (MUL[i - 1] * BASE) % MOD;
9+
}
10+
}
11+
public List<List<Integer>> palindromePairs(String[] words) {
12+
int n = words.length;
13+
long[] prefix = new long[n];
14+
long[] suffix = new long[n];
15+
for (int i = 0; i < n; ++i) {
16+
String word = words[i];
17+
int m = word.length();
18+
for (int j = 0; j < m; ++j) {
19+
int t = word.charAt(j) - 'a' + 1;
20+
int s = word.charAt(m - j - 1) - 'a' + 1;
21+
prefix[i] = (prefix[i] * BASE) % MOD + t;
22+
suffix[i] = (suffix[i] * BASE) % MOD + s;
23+
}
24+
}
25+
List<List<Integer>> ans = new ArrayList<>();
26+
for (int i = 0; i < n; ++i) {
27+
for (int j = i + 1; j < n; ++j) {
28+
if (check(i, j, words[j].length(), words[i].length(), prefix, suffix)) {
29+
ans.add(Arrays.asList(i, j));
30+
}
31+
if (check(j, i, words[i].length(), words[j].length(), prefix, suffix)) {
32+
ans.add(Arrays.asList(j, i));
33+
}
34+
}
35+
}
36+
return ans;
37+
}
38+
39+
private boolean check(int i, int j, int n, int m, long[] prefix, long[] suffix) {
40+
long t = ((prefix[i] * MUL[n]) % MOD + prefix[j]) % MOD;
41+
long s = ((suffix[j] * MUL[m]) % MOD + suffix[i]) % MOD;
42+
return t == s;
43+
}
44+
}

0 commit comments

Comments
 (0)