Skip to content

Commit 4809fab

Browse files
committed
feat: add solutions to lc problem: No.1392.Longest Happy Prefix
1 parent b2942b4 commit 4809fab

File tree

6 files changed

+263
-4
lines changed

6 files changed

+263
-4
lines changed

Diff for: solution/1300-1399/1392.Longest Happy Prefix/README.md

+92-2
Original file line numberDiff line numberDiff line change
@@ -49,27 +49,117 @@
4949
<li><code>s</code> 只含有小写英文字母</li>
5050
</ul>
5151

52-
5352
## 解法
5453

5554
<!-- 这里可写通用的实现逻辑 -->
5655

56+
字符串哈希。用于计算字符串哈希值,快速判断两个字符串是否相等。
57+
5758
<!-- tabs:start -->
5859

5960
### **Python3**
6061

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

6364
```python
64-
65+
class Solution:
66+
def longestPrefix(self, s: str) -> str:
67+
for i in range(1, len(s)):
68+
if s[:-i] == s[i:]:
69+
return s[i:]
70+
return ''
6571
```
6672

6773
### **Java**
6874

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

7177
```java
78+
class Solution {
79+
private long[] p;
80+
private long[] h;
81+
82+
public String longestPrefix(String s) {
83+
int base = 131;
84+
int n = 100010;
85+
p = new long[n];
86+
h = new long[n];
87+
p[0] = 1;
88+
for (int i = 1; i <= s.length(); ++i) {
89+
p[i] = p[i - 1] * base;
90+
h[i] = h[i - 1] * base + s.charAt(i - 1);
91+
}
92+
int l = s.length();
93+
for (int i = l - 1; i > 0; --i) {
94+
if (get(1, i) == get(l - i + 1, l)) {
95+
return s.substring(0, i);
96+
}
97+
}
98+
return "";
99+
}
100+
101+
private long get(int l, int r) {
102+
return h[r] - h[l - 1] * p[r - l + 1];
103+
}
104+
}
105+
```
106+
107+
### **C++**
108+
109+
```cpp
110+
typedef unsigned long long ULL;
111+
class Solution {
112+
public:
113+
string longestPrefix(string s) {
114+
int base = 131;
115+
int n = 100010;
116+
ULL p[100010];
117+
p[0] = 1;
118+
ULL h[100010];
119+
h[0] = 0;
120+
for (int i = 1; i <= s.size(); i++)
121+
{
122+
p[i] = p[i - 1] * base;
123+
h[i] = h[i - 1] * base + s[i - 1];
124+
}
125+
int l = s.size();
126+
for (int i = l - 1; i >= 1; i--)
127+
{
128+
ULL prefix = h[i];
129+
ULL suffix = h[l] - h[l - i] * p[i];
130+
if (prefix == suffix)
131+
{
132+
return s.substr(0, i);
133+
}
134+
}
135+
return "";
136+
}
137+
};
138+
```
72139
140+
### **Go**
141+
142+
```go
143+
func longestPrefix(s string) string {
144+
base := 131
145+
n := 100010
146+
p := make([]int, n)
147+
h := make([]int, n)
148+
p[0] = 1
149+
for i := 1; i <= len(s); i++ {
150+
p[i] = p[i-1] * base
151+
h[i] = h[i-1]*base + int(s[i-1])
152+
}
153+
l := len(s)
154+
for i := l - 1; i > 0; i-- {
155+
prefix := h[i]
156+
suffix := h[l] - h[l-i]*p[i]
157+
if prefix == suffix {
158+
return s[:i]
159+
}
160+
}
161+
return ""
162+
}
73163
```
74164

75165
### **...**

Diff for: solution/1300-1399/1392.Longest Happy Prefix/README_EN.md

+90-2
Original file line numberDiff line numberDiff line change
@@ -49,21 +49,109 @@
4949
<li><code>s</code> contains only lowercase English letters.</li>
5050
</ul>
5151

52-
5352
## Solutions
5453

5554
<!-- tabs:start -->
5655

5756
### **Python3**
5857

5958
```python
60-
59+
class Solution:
60+
def longestPrefix(self, s: str) -> str:
61+
for i in range(1, len(s)):
62+
if s[:-i] == s[i:]:
63+
return s[i:]
64+
return ''
6165
```
6266

6367
### **Java**
6468

6569
```java
70+
class Solution {
71+
private long[] p;
72+
private long[] h;
73+
74+
public String longestPrefix(String s) {
75+
int base = 131;
76+
int n = 100010;
77+
p = new long[n];
78+
h = new long[n];
79+
p[0] = 1;
80+
for (int i = 1; i <= s.length(); ++i) {
81+
p[i] = p[i - 1] * base;
82+
h[i] = h[i - 1] * base + s.charAt(i - 1);
83+
}
84+
int l = s.length();
85+
for (int i = l - 1; i > 0; --i) {
86+
if (get(1, i) == get(l - i + 1, l)) {
87+
return s.substring(0, i);
88+
}
89+
}
90+
return "";
91+
}
92+
93+
private long get(int l, int r) {
94+
return h[r] - h[l - 1] * p[r - l + 1];
95+
}
96+
}
97+
```
98+
99+
### **C++**
100+
101+
```cpp
102+
typedef unsigned long long ULL;
103+
class Solution {
104+
public:
105+
string longestPrefix(string s) {
106+
int base = 131;
107+
int n = 100010;
108+
ULL p[100010];
109+
p[0] = 1;
110+
ULL h[100010];
111+
h[0] = 0;
112+
for (int i = 1; i <= s.size(); i++)
113+
{
114+
p[i] = p[i - 1] * base;
115+
h[i] = h[i - 1] * base + s[i - 1];
116+
}
117+
int l = s.size();
118+
for (int i = l - 1; i >= 1; i--)
119+
{
120+
ULL prefix = h[i];
121+
ULL suffix = h[l] - h[l - i] * p[i];
122+
if (prefix == suffix)
123+
{
124+
return s.substr(0, i);
125+
}
126+
}
127+
return "";
128+
}
129+
};
130+
```
66131
132+
### **Go**
133+
134+
```go
135+
func longestPrefix(s string) string {
136+
base := 131
137+
n := 100010
138+
p := make([]int, n)
139+
h := make([]int, n)
140+
p[0] = 1
141+
for i := 1; i <= len(s); i++ {
142+
p[i] = p[i-1] * base
143+
h[i] = h[i-1]*base + int(s[i-1])
144+
}
145+
l := len(s)
146+
for i := l - 1; i > 0; i-- {
147+
prefix := h[i]
148+
suffix := h[l] - h[l-i]*p[i]
149+
if prefix == suffix {
150+
return s[:i]
151+
}
152+
}
153+
return ""
154+
}
67155
```
68156

69157
### **...**
+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
typedef unsigned long long ULL;
2+
class Solution {
3+
public:
4+
string longestPrefix(string s) {
5+
int base = 131;
6+
int n = 100010;
7+
ULL p[100010];
8+
p[0] = 1;
9+
ULL h[100010];
10+
h[0] = 0;
11+
for (int i = 1; i <= s.size(); i++)
12+
{
13+
p[i] = p[i - 1] * base;
14+
h[i] = h[i - 1] * base + s[i - 1];
15+
}
16+
int l = s.size();
17+
for (int i = l - 1; i >= 1; i--)
18+
{
19+
ULL prefix = h[i];
20+
ULL suffix = h[l] - h[l - i] * p[i];
21+
if (prefix == suffix)
22+
{
23+
return s.substr(0, i);
24+
}
25+
}
26+
return "";
27+
}
28+
};
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
func longestPrefix(s string) string {
2+
base := 131
3+
n := 100010
4+
p := make([]int, n)
5+
h := make([]int, n)
6+
p[0] = 1
7+
for i := 1; i <= len(s); i++ {
8+
p[i] = p[i-1] * base
9+
h[i] = h[i-1]*base + int(s[i-1])
10+
}
11+
l := len(s)
12+
for i := l - 1; i > 0; i-- {
13+
prefix := h[i]
14+
suffix := h[l] - h[l-i]*p[i]
15+
if prefix == suffix {
16+
return s[:i]
17+
}
18+
}
19+
return ""
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
private long[] p;
3+
private long[] h;
4+
5+
public String longestPrefix(String s) {
6+
int base = 131;
7+
int n = 100010;
8+
p = new long[n];
9+
h = new long[n];
10+
p[0] = 1;
11+
for (int i = 1; i <= s.length(); ++i) {
12+
p[i] = p[i - 1] * base;
13+
h[i] = h[i - 1] * base + s.charAt(i - 1);
14+
}
15+
int l = s.length();
16+
for (int i = l - 1; i > 0; --i) {
17+
if (get(1, i) == get(l - i + 1, l)) {
18+
return s.substring(0, i);
19+
}
20+
}
21+
return "";
22+
}
23+
24+
private long get(int l, int r) {
25+
return h[r] - h[l - 1] * p[r - l + 1];
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
class Solution:
2+
def longestPrefix(self, s: str) -> str:
3+
for i in range(1, len(s)):
4+
if s[:-i] == s[i:]:
5+
return s[i:]
6+
return ''

0 commit comments

Comments
 (0)