52
52
53
53
<!-- 这里可写通用的实现逻辑 -->
54
54
55
+ ** 方法一:双指针**
56
+
57
+ 我们用双指针 $i$ 和 $j$ 分别指向字符串 $s$ 的两端,接下来循环以下过程,直至 $i \geq j$:
58
+
59
+ 1 . 如果 $s[ i] $ 不是字母或数字,指针 $i$ 右移一位,继续下一次循环;
60
+ 1 . 如果 $s[ j] $ 不是字母或数字,指针 $j$ 左移一位,继续下一次循环;
61
+ 1 . 如果 $s[ i] $ 和 $s[ j] $ 的小写形式不相等,返回 ` false ` ;
62
+ 1 . 否则,指针 $i$ 右移一位,指针 $j$ 左移一位,继续下一次循环。
63
+
64
+ 循环结束,返回 ` true ` 。
65
+
66
+ 时间复杂度 $O(n)$,其中 $n$ 是字符串 $s$ 的长度。空间复杂度 $O(1)$。
67
+
55
68
<!-- tabs:start -->
56
69
57
70
### ** Python3**
@@ -70,8 +83,7 @@ class Solution:
70
83
elif s[i].lower() != s[j].lower():
71
84
return False
72
85
else :
73
- i += 1
74
- j -= 1
86
+ i, j = i + 1 , j - 1
75
87
return True
76
88
```
77
89
@@ -88,7 +100,7 @@ class Solution {
88
100
++ i;
89
101
} else if (! Character . isLetterOrDigit(s. charAt(j))) {
90
102
-- j;
91
- } else if (Character . toUpperCase (s. charAt(i)) != Character . toUpperCase (s. charAt(j))) {
103
+ } else if (Character . toLowerCase (s. charAt(i)) != Character . toLowerCase (s. charAt(j))) {
92
104
return false ;
93
105
} else {
94
106
++ i;
@@ -108,43 +120,67 @@ public:
108
120
bool isPalindrome(string s) {
109
121
int i = 0, j = s.size() - 1;
110
122
while (i < j) {
111
- if (!isAlphaNum (s[ i] ))
123
+ if (!isalnum (s[ i] )) {
112
124
++i;
113
- else if (!isAlphaNum (s[ j] ))
125
+ } else if (!isalnum (s[ j] )) {
114
126
--j;
115
- else if ((s[ i] + 32 - 'a') % 32 != (s[ j] + 32 - 'a') % 32)
127
+ } else if (tolower (s[ i] ) != tolower (s[ j] )) {
116
128
return false;
117
- else {
129
+ } else {
118
130
++i;
119
131
--j;
120
132
}
121
133
}
122
134
return true;
123
135
}
124
-
125
- private:
126
- bool isAlphaNum(char& ch) {
127
- if (ch >= 'a' && ch <= 'z') return true;
128
- if (ch >= 'A' && ch <= 'Z') return true;
129
- if (ch >= '0' && ch <= '9') return true;
130
- return false;
131
- }
132
136
};
133
137
```
134
138
139
+ ### **Go**
140
+
141
+ ```go
142
+ func isPalindrome(s string) bool {
143
+ i, j := 0, len(s)-1
144
+ for i < j {
145
+ if !isalnum(s[i]) {
146
+ i++
147
+ } else if !isalnum(s[j]) {
148
+ j--
149
+ } else if tolower(s[i]) != tolower(s[j]) {
150
+ return false
151
+ } else {
152
+ i, j = i+1, j-1
153
+ }
154
+ }
155
+ return true
156
+ }
157
+
158
+ func isalnum(ch byte) bool {
159
+ return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')
160
+ }
161
+
162
+ func tolower(ch byte) byte {
163
+ if ch >= 'A' && ch <= 'Z' {
164
+ return ch + 32
165
+ }
166
+ return ch
167
+ }
168
+ ```
169
+
135
170
### ** C#**
136
171
137
172
``` cs
138
- using System.Linq;
139
-
140
173
public class Solution {
141
174
public bool IsPalindrome (string s ) {
142
- var chars = s.Where(ch => char.IsLetterOrDigit(ch)).Select(char.ToLower).ToList();
143
- var i = 0;
144
- var j = chars.Count - 1;
145
- for (; i < j; ++i, --j)
146
- {
147
- if (chars[i] != chars[j]) return false;
175
+ int i = 0 , j = s .Length - 1 ;
176
+ while (i < j ) {
177
+ if (! char .IsLetterOrDigit (s [i ])) {
178
+ ++ i ;
179
+ } else if (! char .IsLetterOrDigit (s [j ])) {
180
+ -- j ;
181
+ } else if (char .ToLower (s [i ++ ]) != char .ToLower (s [j -- ])) {
182
+ return false ;
183
+ }
148
184
}
149
185
return true ;
150
186
}
@@ -159,57 +195,18 @@ public class Solution {
159
195
* @return {boolean}
160
196
*/
161
197
var isPalindrome = function (s ) {
162
- let arr1 = [],
163
- arr2 = [];
164
- for (let i = 0 ; i < s .length ; i++ ) {
165
- if (s[i] >= ' A' && s[i] <= ' Z' ) {
166
- arr1 .push (s[i].toLowerCase ());
167
- }
168
- if ((s[i] >= ' 0' && s[i] <= ' 9' ) || (s[i] >= ' a' && s[i] <= ' z' )) {
169
- arr1 .push (s[i]);
170
- }
171
- }
172
- arr2 = [... arr1];
173
- arr2 .reverse ();
174
- return arr1 .join (' ' ) === arr2 .join (' ' );
175
- };
176
- ```
177
-
178
- ``` js
179
- /**
180
- * @param {string} s
181
- * @return {boolean}
182
- */
183
- var isPalindrome = function (s ) {
184
- function isNumOrAl (a ) {
185
- if (
186
- (a >= ' A' && a <= ' Z' ) ||
187
- (a >= ' 0' && a <= ' 9' ) ||
188
- (a >= ' a' && a <= ' z' )
189
- ) {
190
- return true ;
191
- } else {
192
- return false ;
193
- }
194
- }
195
-
196
- if (s .length === 0 ) {
197
- return true ;
198
- }
199
- let i = 0 ,
200
- j = s .length - 1 ;
198
+ let i = 0 ;
199
+ let j = s .length - 1 ;
201
200
while (i < j) {
202
- while (i < j && ! isNumOrAl (s[i])) {
203
- i++ ;
204
- }
205
- while (i < j && ! isNumOrAl (s[j])) {
206
- j-- ;
207
- }
208
- if (s[i].toLowerCase () !== s[j].toLowerCase ()) {
201
+ if (! / [a-zA-Z0-9 ] / .test (s[i])) {
202
+ ++ i;
203
+ } else if (! / [a-zA-Z0-9 ] / .test (s[j])) {
204
+ -- j;
205
+ } else if (s[i].toLowerCase () !== s[j].toLowerCase ()) {
209
206
return false ;
210
207
} else {
211
- i ++ ;
212
- j -- ;
208
+ ++ i ;
209
+ -- j ;
213
210
}
214
211
}
215
212
return true ;
@@ -220,36 +217,24 @@ var isPalindrome = function (s) {
220
217
221
218
``` ts
222
219
function isPalindrome(s : string ): boolean {
223
- let left: number = 0 ,
224
- right: number = s .length - 1 ;
225
- while (left < right ) {
226
- let char1: string = s .charAt (left );
227
- let char2: string = s .charAt (right );
228
- if (! / [a-zA-Z0-9 ] / .test (char1 )) {
229
- ++ left ;
230
- } else if (! / [a-zA-Z0-9 ] / .test (char2 )) {
231
- -- right ;
232
- } else if (char1 .toLocaleLowerCase () != char2 .toLocaleLowerCase ()) {
220
+ let i = 0 ;
221
+ let j = s .length - 1 ;
222
+ while (i < j ) {
223
+ if (! / [a-zA-Z0-9 ] / .test (s [i ])) {
224
+ ++ i ;
225
+ } else if (! / [a-zA-Z0-9 ] / .test (s [j ])) {
226
+ -- j ;
227
+ } else if (s [i ].toLowerCase () !== s [j ].toLowerCase ()) {
233
228
return false ;
234
229
} else {
235
- ++ left ;
236
- -- right ;
230
+ ++ i ;
231
+ -- j ;
237
232
}
238
233
}
239
234
return true ;
240
235
}
241
236
```
242
237
243
- ``` ts
244
- function isPalindrome(s : string ): boolean {
245
- const isAlphanumeric = (c : string ) => {
246
- return (c >= ' a' && c <= ' z' ) || (c >= ' 0' && c <= ' 9' );
247
- };
248
- const cs = s .toLocaleLowerCase ().split (' ' ).filter (isAlphanumeric );
249
- return cs .join (' ' ) === cs .reverse ().join (' ' );
250
- }
251
- ```
252
-
253
238
### ** Rust**
254
239
255
240
``` rust
@@ -279,35 +264,6 @@ impl Solution {
279
264
}
280
265
```
281
266
282
- ### ** Go**
283
-
284
- ``` go
285
- func isPalindrome (s string ) bool {
286
- s = strings.ToLower (s)
287
- left , right := 0 , len (s) - 1
288
- for left < right {
289
- for left < right && !verify (s[left]) {
290
- left++
291
- }
292
- for left < right && !verify (s[right]) {
293
- right--
294
- }
295
- if left < right {
296
- if s[left] != s[right] {
297
- return false
298
- }
299
- left++
300
- right--
301
- }
302
- }
303
- return true
304
- }
305
-
306
- func verify (ch byte ) bool {
307
- return (ch >= ' A' && ch <= ' Z' ) || (ch >= ' a' && ch <= ' z' ) || (ch >= ' 0' && ch <= ' 9' )
308
- }
309
- ```
310
-
311
267
### ** PHP**
312
268
313
269
``` php
0 commit comments