Skip to content

Commit 1140934

Browse files
committedApr 20, 2023
feat: add solutions to lc problem: No.0125
No.0125.Valid Palindrome
1 parent 220616d commit 1140934

File tree

9 files changed

+211
-304
lines changed

9 files changed

+211
-304
lines changed
 

‎solution/0100-0199/0125.Valid Palindrome/README.md

+78-122
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,19 @@
5252

5353
<!-- 这里可写通用的实现逻辑 -->
5454

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+
5568
<!-- tabs:start -->
5669

5770
### **Python3**
@@ -70,8 +83,7 @@ class Solution:
7083
elif s[i].lower() != s[j].lower():
7184
return False
7285
else:
73-
i += 1
74-
j -= 1
86+
i, j = i + 1, j - 1
7587
return True
7688
```
7789

@@ -88,7 +100,7 @@ class Solution {
88100
++i;
89101
} else if (!Character.isLetterOrDigit(s.charAt(j))) {
90102
--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))) {
92104
return false;
93105
} else {
94106
++i;
@@ -108,43 +120,67 @@ public:
108120
bool isPalindrome(string s) {
109121
int i = 0, j = s.size() - 1;
110122
while (i < j) {
111-
if (!isAlphaNum(s[i]))
123+
if (!isalnum(s[i])) {
112124
++i;
113-
else if (!isAlphaNum(s[j]))
125+
} else if (!isalnum(s[j])) {
114126
--j;
115-
else if ((s[i] + 32 - 'a') % 32 != (s[j] + 32 - 'a') % 32)
127+
} else if (tolower(s[i]) != tolower(s[j])) {
116128
return false;
117-
else {
129+
} else {
118130
++i;
119131
--j;
120132
}
121133
}
122134
return true;
123135
}
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-
}
132136
};
133137
```
134138
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+
135170
### **C#**
136171

137172
```cs
138-
using System.Linq;
139-
140173
public class Solution {
141174
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+
}
148184
}
149185
return true;
150186
}
@@ -159,57 +195,18 @@ public class Solution {
159195
* @return {boolean}
160196
*/
161197
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;
201200
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()) {
209206
return false;
210207
} else {
211-
i++;
212-
j--;
208+
++i;
209+
--j;
213210
}
214211
}
215212
return true;
@@ -220,36 +217,24 @@ var isPalindrome = function (s) {
220217

221218
```ts
222219
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()) {
233228
return false;
234229
} else {
235-
++left;
236-
--right;
230+
++i;
231+
--j;
237232
}
238233
}
239234
return true;
240235
}
241236
```
242237

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-
253238
### **Rust**
254239

255240
```rust
@@ -279,35 +264,6 @@ impl Solution {
279264
}
280265
```
281266

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-
311267
### **PHP**
312268

313269
```php

‎solution/0100-0199/0125.Valid Palindrome/README_EN.md

+65-122
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ class Solution:
6060
elif s[i].lower() != s[j].lower():
6161
return False
6262
else:
63-
i += 1
64-
j -= 1
63+
i, j = i + 1, j - 1
6564
return True
6665
```
6766

@@ -76,7 +75,7 @@ class Solution {
7675
++i;
7776
} else if (!Character.isLetterOrDigit(s.charAt(j))) {
7877
--j;
79-
} else if (Character.toUpperCase(s.charAt(i)) != Character.toUpperCase(s.charAt(j))) {
78+
} else if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j))) {
8079
return false;
8180
} else {
8281
++i;
@@ -96,43 +95,67 @@ public:
9695
bool isPalindrome(string s) {
9796
int i = 0, j = s.size() - 1;
9897
while (i < j) {
99-
if (!isAlphaNum(s[i]))
98+
if (!isalnum(s[i])) {
10099
++i;
101-
else if (!isAlphaNum(s[j]))
100+
} else if (!isalnum(s[j])) {
102101
--j;
103-
else if ((s[i] + 32 - 'a') % 32 != (s[j] + 32 - 'a') % 32)
102+
} else if (tolower(s[i]) != tolower(s[j])) {
104103
return false;
105-
else {
104+
} else {
106105
++i;
107106
--j;
108107
}
109108
}
110109
return true;
111110
}
112-
113-
private:
114-
bool isAlphaNum(char& ch) {
115-
if (ch >= 'a' && ch <= 'z') return true;
116-
if (ch >= 'A' && ch <= 'Z') return true;
117-
if (ch >= '0' && ch <= '9') return true;
118-
return false;
119-
}
120111
};
121112
```
122113
114+
### **Go**
115+
116+
```go
117+
func isPalindrome(s string) bool {
118+
i, j := 0, len(s)-1
119+
for i < j {
120+
if !isalnum(s[i]) {
121+
i++
122+
} else if !isalnum(s[j]) {
123+
j--
124+
} else if tolower(s[i]) != tolower(s[j]) {
125+
return false
126+
} else {
127+
i, j = i+1, j-1
128+
}
129+
}
130+
return true
131+
}
132+
133+
func isalnum(ch byte) bool {
134+
return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')
135+
}
136+
137+
func tolower(ch byte) byte {
138+
if ch >= 'A' && ch <= 'Z' {
139+
return ch + 32
140+
}
141+
return ch
142+
}
143+
```
144+
123145
### **C#**
124146

125147
```cs
126-
using System.Linq;
127-
128148
public class Solution {
129149
public bool IsPalindrome(string s) {
130-
var chars = s.Where(ch => char.IsLetterOrDigit(ch)).Select(char.ToLower).ToList();
131-
var i = 0;
132-
var j = chars.Count - 1;
133-
for (; i < j; ++i, --j)
134-
{
135-
if (chars[i] != chars[j]) return false;
150+
int i = 0, j = s.Length - 1;
151+
while (i < j) {
152+
if (!char.IsLetterOrDigit(s[i])) {
153+
++i;
154+
} else if (!char.IsLetterOrDigit(s[j])) {
155+
--j;
156+
} else if (char.ToLower(s[i++]) != char.ToLower(s[j--])) {
157+
return false;
158+
}
136159
}
137160
return true;
138161
}
@@ -147,57 +170,18 @@ public class Solution {
147170
* @return {boolean}
148171
*/
149172
var isPalindrome = function (s) {
150-
let arr1 = [],
151-
arr2 = [];
152-
for (let i = 0; i < s.length; i++) {
153-
if (s[i] >= 'A' && s[i] <= 'Z') {
154-
arr1.push(s[i].toLowerCase());
155-
}
156-
if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z')) {
157-
arr1.push(s[i]);
158-
}
159-
}
160-
arr2 = [...arr1];
161-
arr2.reverse();
162-
return arr1.join('') === arr2.join('');
163-
};
164-
```
165-
166-
```js
167-
/**
168-
* @param {string} s
169-
* @return {boolean}
170-
*/
171-
var isPalindrome = function (s) {
172-
function isNumOrAl(a) {
173-
if (
174-
(a >= 'A' && a <= 'Z') ||
175-
(a >= '0' && a <= '9') ||
176-
(a >= 'a' && a <= 'z')
177-
) {
178-
return true;
179-
} else {
180-
return false;
181-
}
182-
}
183-
184-
if (s.length === 0) {
185-
return true;
186-
}
187-
let i = 0,
188-
j = s.length - 1;
173+
let i = 0;
174+
let j = s.length - 1;
189175
while (i < j) {
190-
while (i < j && !isNumOrAl(s[i])) {
191-
i++;
192-
}
193-
while (i < j && !isNumOrAl(s[j])) {
194-
j--;
195-
}
196-
if (s[i].toLowerCase() !== s[j].toLowerCase()) {
176+
if (!/[a-zA-Z0-9]/.test(s[i])) {
177+
++i;
178+
} else if (!/[a-zA-Z0-9]/.test(s[j])) {
179+
--j;
180+
} else if (s[i].toLowerCase() !== s[j].toLowerCase()) {
197181
return false;
198182
} else {
199-
i++;
200-
j--;
183+
++i;
184+
--j;
201185
}
202186
}
203187
return true;
@@ -208,36 +192,24 @@ var isPalindrome = function (s) {
208192

209193
```ts
210194
function isPalindrome(s: string): boolean {
211-
let left: number = 0,
212-
right: number = s.length - 1;
213-
while (left < right) {
214-
let char1: string = s.charAt(left);
215-
let char2: string = s.charAt(right);
216-
if (!/[a-zA-Z0-9]/.test(char1)) {
217-
++left;
218-
} else if (!/[a-zA-Z0-9]/.test(char2)) {
219-
--right;
220-
} else if (char1.toLocaleLowerCase() != char2.toLocaleLowerCase()) {
195+
let i = 0;
196+
let j = s.length - 1;
197+
while (i < j) {
198+
if (!/[a-zA-Z0-9]/.test(s[i])) {
199+
++i;
200+
} else if (!/[a-zA-Z0-9]/.test(s[j])) {
201+
--j;
202+
} else if (s[i].toLowerCase() !== s[j].toLowerCase()) {
221203
return false;
222204
} else {
223-
++left;
224-
--right;
205+
++i;
206+
--j;
225207
}
226208
}
227209
return true;
228210
}
229211
```
230212

231-
```ts
232-
function isPalindrome(s: string): boolean {
233-
const isAlphanumeric = (c: string) => {
234-
return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9');
235-
};
236-
const cs = s.toLocaleLowerCase().split('').filter(isAlphanumeric);
237-
return cs.join('') === cs.reverse().join('');
238-
}
239-
```
240-
241213
### **Rust**
242214

243215
```rust
@@ -267,35 +239,6 @@ impl Solution {
267239
}
268240
```
269241

270-
### **Go**
271-
272-
```go
273-
func isPalindrome(s string) bool {
274-
s = strings.ToLower(s)
275-
left, right := 0, len(s) - 1
276-
for left < right {
277-
for left < right && !verify(s[left]) {
278-
left++
279-
}
280-
for left < right && !verify(s[right]) {
281-
right--
282-
}
283-
if left < right {
284-
if s[left] != s[right] {
285-
return false
286-
}
287-
left++
288-
right--
289-
}
290-
}
291-
return true
292-
}
293-
294-
func verify(ch byte) bool {
295-
return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')
296-
}
297-
```
298-
299242
### **PHP**
300243

301244
```php

‎solution/0100-0199/0125.Valid Palindrome/Solution.cpp

+4-12
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,17 @@ class Solution {
33
bool isPalindrome(string s) {
44
int i = 0, j = s.size() - 1;
55
while (i < j) {
6-
if (!isAlphaNum(s[i]))
6+
if (!isalnum(s[i])) {
77
++i;
8-
else if (!isAlphaNum(s[j]))
8+
} else if (!isalnum(s[j])) {
99
--j;
10-
else if ((s[i] + 32 - 'a') % 32 != (s[j] + 32 - 'a') % 32)
10+
} else if (tolower(s[i]) != tolower(s[j])) {
1111
return false;
12-
else {
12+
} else {
1313
++i;
1414
--j;
1515
}
1616
}
1717
return true;
1818
}
19-
20-
private:
21-
bool isAlphaNum(char& ch) {
22-
if (ch >= 'a' && ch <= 'z') return true;
23-
if (ch >= 'A' && ch <= 'Z') return true;
24-
if (ch >= '0' && ch <= '9') return true;
25-
return false;
26-
}
2719
};

‎solution/0100-0199/0125.Valid Palindrome/Solution.cs

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
using System.Linq;
2-
31
public class Solution {
42
public bool IsPalindrome(string s) {
5-
var chars = s.Where(ch => char.IsLetterOrDigit(ch)).Select(char.ToLower).ToList();
6-
var i = 0;
7-
var j = chars.Count - 1;
8-
for (; i < j; ++i, --j)
9-
{
10-
if (chars[i] != chars[j]) return false;
3+
int i = 0, j = s.Length - 1;
4+
while (i < j) {
5+
if (!char.IsLetterOrDigit(s[i])) {
6+
++i;
7+
} else if (!char.IsLetterOrDigit(s[j])) {
8+
--j;
9+
} else if (char.ToLower(s[i++]) != char.ToLower(s[j--])) {
10+
return false;
11+
}
1112
}
1213
return true;
1314
}
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
func isPalindrome(s string) bool {
2-
s = strings.ToLower(s)
3-
left, right := 0, len(s) - 1
4-
for left < right {
5-
for left < right && !verify(s[left]) {
6-
left++
7-
}
8-
for left < right && !verify(s[right]) {
9-
right--
10-
}
11-
if left < right {
12-
if s[left] != s[right] {
13-
return false
14-
}
15-
left++
16-
right--
2+
i, j := 0, len(s)-1
3+
for i < j {
4+
if !isalnum(s[i]) {
5+
i++
6+
} else if !isalnum(s[j]) {
7+
j--
8+
} else if tolower(s[i]) != tolower(s[j]) {
9+
return false
10+
} else {
11+
i, j = i+1, j-1
1712
}
1813
}
1914
return true
2015
}
2116

22-
func verify(ch byte) bool {
17+
func isalnum(ch byte) bool {
2318
return (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')
19+
}
20+
21+
func tolower(ch byte) byte {
22+
if ch >= 'A' && ch <= 'Z' {
23+
return ch + 32
24+
}
25+
return ch
2426
}

‎solution/0100-0199/0125.Valid Palindrome/Solution.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public boolean isPalindrome(String s) {
66
++i;
77
} else if (!Character.isLetterOrDigit(s.charAt(j))) {
88
--j;
9-
} else if (Character.toUpperCase(s.charAt(i)) != Character.toUpperCase(s.charAt(j))) {
9+
} else if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j))) {
1010
return false;
1111
} else {
1212
++i;

‎solution/0100-0199/0125.Valid Palindrome/Solution.js

+13-11
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,19 @@
33
* @return {boolean}
44
*/
55
var isPalindrome = function (s) {
6-
let arr1 = [],
7-
arr2 = [];
8-
for (let i = 0; i < s.length; i++) {
9-
if (s[i] >= 'A' && s[i] <= 'Z') {
10-
arr1.push(s[i].toLowerCase());
11-
}
12-
if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'a' && s[i] <= 'z')) {
13-
arr1.push(s[i]);
6+
let i = 0;
7+
let j = s.length - 1;
8+
while (i < j) {
9+
if (!/[a-zA-Z0-9]/.test(s[i])) {
10+
++i;
11+
} else if (!/[a-zA-Z0-9]/.test(s[j])) {
12+
--j;
13+
} else if (s[i].toLowerCase() !== s[j].toLowerCase()) {
14+
return false;
15+
} else {
16+
++i;
17+
--j;
1418
}
1519
}
16-
arr2 = [...arr1];
17-
arr2.reverse();
18-
return arr1.join('') === arr2.join('');
20+
return true;
1921
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def isPalindrome(self, s: str) -> bool:
3+
i, j = 0, len(s) - 1
4+
while i < j:
5+
if not s[i].isalnum():
6+
i += 1
7+
elif not s[j].isalnum():
8+
j -= 1
9+
elif s[i].lower() != s[j].lower():
10+
return False
11+
else:
12+
i, j = i + 1, j - 1
13+
return True

‎solution/0100-0199/0125.Valid Palindrome/Solution.ts

+10-12
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
function isPalindrome(s: string): boolean {
2-
let left: number = 0,
3-
right: number = s.length - 1;
4-
while (left < right) {
5-
let char1: string = s.charAt(left);
6-
let char2: string = s.charAt(right);
7-
if (!/[a-zA-Z0-9]/.test(char1)) {
8-
++left;
9-
} else if (!/[a-zA-Z0-9]/.test(char2)) {
10-
--right;
11-
} else if (char1.toLocaleLowerCase() != char2.toLocaleLowerCase()) {
2+
let i = 0;
3+
let j = s.length - 1;
4+
while (i < j) {
5+
if (!/[a-zA-Z0-9]/.test(s[i])) {
6+
++i;
7+
} else if (!/[a-zA-Z0-9]/.test(s[j])) {
8+
--j;
9+
} else if (s[i].toLowerCase() !== s[j].toLowerCase()) {
1210
return false;
1311
} else {
14-
++left;
15-
--right;
12+
++i;
13+
--j;
1614
}
1715
}
1816
return true;

0 commit comments

Comments
 (0)
Please sign in to comment.