@@ -81,18 +81,17 @@ class Solution {
81
81
82
82
public String longestPrefix (String s ) {
83
83
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 ];
87
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 );
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);
91
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);
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);
96
95
}
97
96
}
98
97
return " " ;
@@ -108,29 +107,26 @@ class Solution {
108
107
109
108
``` cpp
110
109
typedef unsigned long long ULL;
110
+
111
111
class Solution {
112
112
public:
113
113
string longestPrefix(string s) {
114
114
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] ;
117
118
p[ 0] = 1;
118
- ULL h[ 100010] ;
119
119
h[ 0] = 0;
120
- for (int i = 1 ; i <= s.size(); i++ )
120
+ for (int i = 0 ; i < n; ++i )
121
121
{
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] ;
124
124
}
125
- int l = s.size();
126
- for (int i = l - 1; i >= 1; i--)
125
+ for (int l = n - 1; l > 0; --l)
127
126
{
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);
134
130
}
135
131
return "";
136
132
}
@@ -142,20 +138,18 @@ public:
142
138
```go
143
139
func longestPrefix(s string) string {
144
140
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 )
148
144
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 )
152
148
}
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]
157
151
if prefix == suffix {
158
- return s[:i ]
152
+ return s[:l ]
159
153
}
160
154
}
161
155
return ""
0 commit comments