Skip to content

Commit 770b85e

Browse files
committed
feat: update solutions to lc problems: No.1044,1392
* No.1044.Longest Duplicate Substring * No.1392.Longest Happy Prefix
1 parent f00f880 commit 770b85e

File tree

10 files changed

+111
-126
lines changed

10 files changed

+111
-126
lines changed

solution/1000-1099/1044.Longest Duplicate Substring/README.md

+8-7
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ class Solution {
9898
while (left < right) {
9999
int mid = (left + right + 1) >> 1;
100100
String t = check(s, mid);
101-
ans = t.length() > ans.length() ? t : ans;
102101
if (t.length() > 0) {
103102
left = mid;
103+
ans = t;
104104
} else {
105105
right = mid - 1;
106106
}
@@ -147,9 +147,12 @@ public:
147147
{
148148
int mid = (left + right + 1) >> 1;
149149
string t = check(s, mid);
150-
if (t.size() > ans.size()) ans = t;
151-
if (t.size() > 0) left = mid;
152-
else right = mid - 1;
150+
if (t.empty()) right = mid - 1;
151+
else
152+
{
153+
left = mid;
154+
ans = t;
155+
}
153156
}
154157
return ans;
155158
}
@@ -198,11 +201,9 @@ func longestDupSubstring(s string) string {
198201
for left < right {
199202
mid := (left + right + 1) >> 1
200203
t := check(mid)
201-
if len(t) > len(ans) {
202-
ans = t
203-
}
204204
if len(t) > 0 {
205205
left = mid
206+
ans = t
206207
} else {
207208
right = mid - 1
208209
}

solution/1000-1099/1044.Longest Duplicate Substring/README_EN.md

+8-7
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,9 @@ class Solution {
7979
while (left < right) {
8080
int mid = (left + right + 1) >> 1;
8181
String t = check(s, mid);
82-
ans = t.length() > ans.length() ? t : ans;
8382
if (t.length() > 0) {
8483
left = mid;
84+
ans = t;
8585
} else {
8686
right = mid - 1;
8787
}
@@ -128,9 +128,12 @@ public:
128128
{
129129
int mid = (left + right + 1) >> 1;
130130
string t = check(s, mid);
131-
if (t.size() > ans.size()) ans = t;
132-
if (t.size() > 0) left = mid;
133-
else right = mid - 1;
131+
if (t.empty()) right = mid - 1;
132+
else
133+
{
134+
left = mid;
135+
ans = t;
136+
}
134137
}
135138
return ans;
136139
}
@@ -179,11 +182,9 @@ func longestDupSubstring(s string) string {
179182
for left < right {
180183
mid := (left + right + 1) >> 1
181184
t := check(mid)
182-
if len(t) > len(ans) {
183-
ans = t
184-
}
185185
if len(t) > 0 {
186186
left = mid
187+
ans = t
187188
} else {
188189
right = mid - 1
189190
}

solution/1000-1099/1044.Longest Duplicate Substring/Solution.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@ class Solution {
1818
{
1919
int mid = (left + right + 1) >> 1;
2020
string t = check(s, mid);
21-
if (t.size() > ans.size()) ans = t;
22-
if (t.size() > 0) left = mid;
23-
else right = mid - 1;
21+
if (t.empty()) right = mid - 1;
22+
else
23+
{
24+
left = mid;
25+
ans = t;
26+
}
2427
}
2528
return ans;
2629
}

solution/1000-1099/1044.Longest Duplicate Substring/Solution.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,9 @@ func longestDupSubstring(s string) string {
2424
for left < right {
2525
mid := (left + right + 1) >> 1
2626
t := check(mid)
27-
if len(t) > len(ans) {
28-
ans = t
29-
}
3027
if len(t) > 0 {
3128
left = mid
29+
ans = t
3230
} else {
3331
right = mid - 1
3432
}

solution/1000-1099/1044.Longest Duplicate Substring/Solution.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ public String longestDupSubstring(String s) {
1717
while (left < right) {
1818
int mid = (left + right + 1) >> 1;
1919
String t = check(s, mid);
20-
ans = t.length() > ans.length() ? t : ans;
2120
if (t.length() > 0) {
2221
left = mid;
22+
ans = t;
2323
} else {
2424
right = mid - 1;
2525
}

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

+29-35
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,17 @@ class Solution {
8181

8282
public String longestPrefix(String s) {
8383
int base = 131;
84-
int n = 100010;
85-
p = new long[n];
86-
h = new long[n];
84+
int n = s.length();
85+
p = new long[n + 10];
86+
h = new long[n + 10];
8787
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);
88+
for (int i = 0; i < n; ++i) {
89+
p[i + 1] = p[i] * base;
90+
h[i + 1] = h[i] * base + s.charAt(i);
9191
}
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);
92+
for (int l = n - 1; l > 0; --l) {
93+
if (get(1, l) == get(n - l + 1, n)) {
94+
return s.substring(0, l);
9695
}
9796
}
9897
return "";
@@ -108,29 +107,26 @@ class Solution {
108107

109108
```cpp
110109
typedef unsigned long long ULL;
110+
111111
class Solution {
112112
public:
113113
string longestPrefix(string s) {
114114
int base = 131;
115-
int n = 100010;
116-
ULL p[100010];
115+
int n = s.size();
116+
ULL p[n + 10];
117+
ULL h[n + 10];
117118
p[0] = 1;
118-
ULL h[100010];
119119
h[0] = 0;
120-
for (int i = 1; i <= s.size(); i++)
120+
for (int i = 0; i < n; ++i)
121121
{
122-
p[i] = p[i - 1] * base;
123-
h[i] = h[i - 1] * base + s[i - 1];
122+
p[i + 1] = p[i] * base;
123+
h[i + 1] = h[i] * base + s[i];
124124
}
125-
int l = s.size();
126-
for (int i = l - 1; i >= 1; i--)
125+
for (int l = n - 1; l > 0; --l)
127126
{
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-
}
127+
ULL prefix = h[l];
128+
ULL suffix = h[n] - h[n - l] * p[l];
129+
if (prefix == suffix) return s.substr(0, l);
134130
}
135131
return "";
136132
}
@@ -142,20 +138,18 @@ public:
142138
```go
143139
func longestPrefix(s string) string {
144140
base := 131
145-
n := 100010
146-
p := make([]int, n)
147-
h := make([]int, n)
141+
n := len(s)
142+
p := make([]int, n+10)
143+
h := make([]int, n+10)
148144
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])
145+
for i, c := range s {
146+
p[i+1] = p[i] * base
147+
h[i+1] = h[i]*base + int(c)
152148
}
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]
149+
for l := n - 1; l > 0; l-- {
150+
prefix, suffix := h[l], h[n]-h[n-l]*p[l]
157151
if prefix == suffix {
158-
return s[:i]
152+
return s[:l]
159153
}
160154
}
161155
return ""

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

+29-35
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,17 @@ class Solution {
7373

7474
public String longestPrefix(String s) {
7575
int base = 131;
76-
int n = 100010;
77-
p = new long[n];
78-
h = new long[n];
76+
int n = s.length();
77+
p = new long[n + 10];
78+
h = new long[n + 10];
7979
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);
80+
for (int i = 0; i < n; ++i) {
81+
p[i + 1] = p[i] * base;
82+
h[i + 1] = h[i] * base + s.charAt(i);
8383
}
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);
84+
for (int l = n - 1; l > 0; --l) {
85+
if (get(1, l) == get(n - l + 1, n)) {
86+
return s.substring(0, l);
8887
}
8988
}
9089
return "";
@@ -100,29 +99,26 @@ class Solution {
10099

101100
```cpp
102101
typedef unsigned long long ULL;
102+
103103
class Solution {
104104
public:
105105
string longestPrefix(string s) {
106106
int base = 131;
107-
int n = 100010;
108-
ULL p[100010];
107+
int n = s.size();
108+
ULL p[n + 10];
109+
ULL h[n + 10];
109110
p[0] = 1;
110-
ULL h[100010];
111111
h[0] = 0;
112-
for (int i = 1; i <= s.size(); i++)
112+
for (int i = 0; i < n; ++i)
113113
{
114-
p[i] = p[i - 1] * base;
115-
h[i] = h[i - 1] * base + s[i - 1];
114+
p[i + 1] = p[i] * base;
115+
h[i + 1] = h[i] * base + s[i];
116116
}
117-
int l = s.size();
118-
for (int i = l - 1; i >= 1; i--)
117+
for (int l = n - 1; l > 0; --l)
119118
{
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-
}
119+
ULL prefix = h[l];
120+
ULL suffix = h[n] - h[n - l] * p[l];
121+
if (prefix == suffix) return s.substr(0, l);
126122
}
127123
return "";
128124
}
@@ -134,20 +130,18 @@ public:
134130
```go
135131
func longestPrefix(s string) string {
136132
base := 131
137-
n := 100010
138-
p := make([]int, n)
139-
h := make([]int, n)
133+
n := len(s)
134+
p := make([]int, n+10)
135+
h := make([]int, n+10)
140136
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])
137+
for i, c := range s {
138+
p[i+1] = p[i] * base
139+
h[i+1] = h[i]*base + int(c)
144140
}
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]
141+
for l := n - 1; l > 0; l-- {
142+
prefix, suffix := h[l], h[n]-h[n-l]*p[l]
149143
if prefix == suffix {
150-
return s[:i]
144+
return s[:l]
151145
}
152146
}
153147
return ""

solution/1300-1399/1392.Longest Happy Prefix/Solution.cpp

+11-14
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,24 @@
11
typedef unsigned long long ULL;
2+
23
class Solution {
34
public:
45
string longestPrefix(string s) {
56
int base = 131;
6-
int n = 100010;
7-
ULL p[100010];
7+
int n = s.size();
8+
ULL p[n + 10];
9+
ULL h[n + 10];
810
p[0] = 1;
9-
ULL h[100010];
1011
h[0] = 0;
11-
for (int i = 1; i <= s.size(); i++)
12+
for (int i = 0; i < n; ++i)
1213
{
13-
p[i] = p[i - 1] * base;
14-
h[i] = h[i - 1] * base + s[i - 1];
14+
p[i + 1] = p[i] * base;
15+
h[i + 1] = h[i] * base + s[i];
1516
}
16-
int l = s.size();
17-
for (int i = l - 1; i >= 1; i--)
17+
for (int l = n - 1; l > 0; --l)
1818
{
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-
}
19+
ULL prefix = h[l];
20+
ULL suffix = h[n] - h[n - l] * p[l];
21+
if (prefix == suffix) return s.substr(0, l);
2522
}
2623
return "";
2724
}

solution/1300-1399/1392.Longest Happy Prefix/Solution.go

+9-11
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
func longestPrefix(s string) string {
22
base := 131
3-
n := 100010
4-
p := make([]int, n)
5-
h := make([]int, n)
3+
n := len(s)
4+
p := make([]int, n+10)
5+
h := make([]int, n+10)
66
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])
7+
for i, c := range s {
8+
p[i+1] = p[i] * base
9+
h[i+1] = h[i]*base + int(c)
1010
}
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]
11+
for l := n - 1; l > 0; l-- {
12+
prefix, suffix := h[l], h[n]-h[n-l]*p[l]
1513
if prefix == suffix {
16-
return s[:i]
14+
return s[:l]
1715
}
1816
}
1917
return ""

0 commit comments

Comments
 (0)