39
39
40
40
<!-- 这里可写通用的实现逻辑 -->
41
41
42
- 字符串哈希 + 二分查找。
42
+ ** 方法一: 字符串哈希 + 二分查找**
43
43
44
44
字符串哈希用于计算字符串哈希值,快速判断两个字符串是否相等。二分枚举长度,找到满足条件的最大长度即可。
45
45
52
52
``` python
53
53
class Solution :
54
54
def longestDupSubstring (self , s : str ) -> str :
55
- n = len (s)
56
-
57
55
def check (l ):
58
- seen = set ()
56
+ vis = set ()
59
57
for i in range (n - l + 1 ):
60
58
t = s[i: i + l]
61
- if t in seen :
59
+ if t in vis :
62
60
return t
63
- seen .add(t)
61
+ vis .add(t)
64
62
return ' '
65
63
64
+ n = len (s)
66
65
left, right = 0 , n
67
66
ans = ' '
68
67
while left < right:
69
68
mid = (left + right + 1 ) >> 1
70
69
t = check(mid)
71
70
ans = t or ans
72
- if len (t) > 0 :
71
+ if t :
73
72
left = mid
74
73
else :
75
74
right = mid - 1
@@ -112,14 +111,14 @@ class Solution {
112
111
113
112
private String check (String s , int len ) {
114
113
int n = s. length();
115
- Set<Long > seen = new HashSet<> ();
114
+ Set<Long > vis = new HashSet<> ();
116
115
for (int i = 1 ; i + len - 1 <= n; ++ i) {
117
116
int j = i + len - 1 ;
118
117
long t = h[j] - h[i - 1 ] * p[j - i + 1 ];
119
- if (seen . contains(t)) {
118
+ if (vis . contains(t)) {
120
119
return s. substring(i - 1 , j);
121
120
}
122
- seen . add(t);
121
+ vis . add(t);
123
122
}
124
123
return " " ;
125
124
}
@@ -159,15 +158,15 @@ public:
159
158
return ans;
160
159
}
161
160
162
- string check(string s, int len) {
161
+ string check(string& s, int len) {
163
162
int n = s.size();
164
- unordered_set<ULL> seen ;
163
+ unordered_set<ULL> vis ;
165
164
for (int i = 1; i + len - 1 <= n; ++i)
166
165
{
167
166
int j = i + len - 1;
168
167
ULL t = h[j] - h[i - 1] * p[j - i + 1];
169
- if (seen .count(t)) return s.substr(i - 1, len);
170
- seen .insert(t);
168
+ if (vis .count(t)) return s.substr(i - 1, len);
169
+ vis .insert(t);
171
170
}
172
171
return " " ;
173
172
}
@@ -187,14 +186,14 @@ func longestDupSubstring(s string) string {
187
186
h[i+1 ] = h[i]*int64 (base) + int64 (s[i])
188
187
}
189
188
check := func (l int ) string {
190
- seen := make (map [int64 ]bool )
189
+ vis := make (map [int64 ]bool )
191
190
for i := 1 ; i+l-1 <= n; i++ {
192
191
j := i + l - 1
193
192
t := h[j] - h[i-1 ]*p[j-i+1 ]
194
- if seen [t] {
193
+ if vis [t] {
195
194
return s[i-1 : j]
196
195
}
197
- seen [t] = true
196
+ vis [t] = true
198
197
}
199
198
return " "
200
199
}
0 commit comments