Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9c01e18

Browse files
feat: add solutions to lcof2 problem: No.019 (doocs#1508)
No.019.最多删除一个字符得到回文
1 parent fb9ada3 commit 9c01e18

File tree

6 files changed

+120
-109
lines changed

6 files changed

+120
-109
lines changed

‎lcof2/剑指 Offer II 019. 最多删除一个字符得到回文/README.md‎

Lines changed: 53 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,14 @@
4646

4747
<!-- 这里可写通用的实现逻辑 -->
4848

49-
双指针,当 `s[i]` 不等于 `s[j]` 时,分别尝试跳过 `i` 或跳过 `j`
49+
**方法一:双指针**
50+
51+
我们用两个指针 $i$ 和 $j$ 分别指向字符串 $s$ 的第一个字符和最后一个字符,然后向中间移动指针,每次判断 $s[i]$ 和 $s[j]$ 是否相等:
52+
53+
- 如果 $s[i] = s[j],ドル则指针 $i$ 向后移动一位,指针 $j$ 向前移动一位;
54+
- 否则,存在两种情况,即删除字符 $s[i]$ 或者删除字符 $s[j],ドル然后判断删除之后的字符串是否是回文字符串。即判断子串 $s[i+1..j]$ 或者子串 $s[i..j-1]$ 是否是回文字符串。
55+
56+
时间复杂度 $O(n),ドル其中 $n$ 是字符串 $s$ 的长度。空间复杂度 $O(1)$。
5057

5158
<!-- tabs:start -->
5259

@@ -57,7 +64,7 @@
5764
```python
5865
class Solution:
5966
def validPalindrome(self, s: str) -> bool:
60-
def check(i, j):
67+
def check(i: int, j: int) -> bool:
6168
while i < j:
6269
if s[i] != s[j]:
6370
return False
@@ -67,7 +74,7 @@ class Solution:
6774
i, j = 0, len(s) - 1
6875
while i < j:
6976
if s[i] != s[j]:
70-
return check(i, j -1) or check(i+1, j)
77+
return check(i+1, j) or check(i, j-1)
7178
i, j = i + 1, j - 1
7279
return True
7380
```
@@ -78,16 +85,19 @@ class Solution:
7885

7986
```java
8087
class Solution {
88+
private String s;
89+
8190
public boolean validPalindrome(String s) {
91+
this.s = s;
8292
for (int i = 0, j = s.length() - 1; i < j; ++i, --j) {
8393
if (s.charAt(i) != s.charAt(j)) {
84-
return check(s, i + 1, j) || check(s, i, j - 1);
94+
return check(i + 1, j) || check(i, j - 1);
8595
}
8696
}
8797
return true;
8898
}
8999

90-
private boolean check(Strings, int i, int j) {
100+
private boolean check(int i, int j) {
91101
for (; i < j; ++i, --j) {
92102
if (s.charAt(i) != s.charAt(j)) {
93103
return false;
@@ -98,48 +108,26 @@ class Solution {
98108
}
99109
```
100110

101-
### **TypeScript**
102-
103-
```ts
104-
function validPalindrome(s: string): boolean {
105-
for (let i: number = 0, j = s.length - 1; i < j; ++i, --j) {
106-
if (s.charAt(i) != s.charAt(j)) {
107-
return (
108-
isPalinddrome(s.slice(i, j)) ||
109-
isPalinddrome(s.slice(i + 1, j + 1))
110-
);
111-
}
112-
}
113-
return true;
114-
}
115-
116-
function isPalinddrome(s: string): boolean {
117-
for (let i: number = 0, j = s.length - 1; i < j; ++i, --j) {
118-
if (s.charAt(i) != s.charAt(j)) {
119-
return false;
120-
}
121-
}
122-
return true;
123-
}
124-
```
125-
126111
### **C++**
127112

128113
```cpp
129114
class Solution {
130115
public:
131116
bool validPalindrome(string s) {
132-
for (int i = 0, j = s.size() - 1; i < j; ++i, --j)
133-
if (s[i] != s[j])
134-
return check(s, i + 1, j) || check(s, i, j - 1);
135-
return 1;
136-
}
137-
138-
bool check(string s, int i, int j) {
139-
for (; i < j; ++i, --j)
140-
if (s[i] != s[j])
141-
return 0;
142-
return 1;
117+
auto check = [&](int i, int j) {
118+
for (; i < j; ++i, --j) {
119+
if (s[i] != s[j]) {
120+
return false;
121+
}
122+
}
123+
return true;
124+
};
125+
for (int i = 0, j = s.size() - 1; i < j; ++i, --j) {
126+
if (s[i] != s[j]) {
127+
return check(i + 1, j) || check(i, j - 1);
128+
}
129+
}
130+
return true;
143131
}
144132
};
145133
```
@@ -165,6 +153,27 @@ func validPalindrome(s string) bool {
165153
}
166154
```
167155

156+
### **TypeScript**
157+
158+
```ts
159+
function validPalindrome(s: string): boolean {
160+
const check = (i: number, j: number): boolean => {
161+
for (; i < j; ++i, --j) {
162+
if (s[i] !== s[j]) {
163+
return false;
164+
}
165+
}
166+
return true;
167+
};
168+
for (let i = 0, j = s.length - 1; i < j; ++i, --j) {
169+
if (s[i] !== s[j]) {
170+
return check(i + 1, j) || check(i, j - 1);
171+
}
172+
}
173+
return true;
174+
}
175+
```
176+
168177
### **JavaScript**
169178

170179
```js
@@ -173,16 +182,16 @@ func validPalindrome(s string) bool {
173182
* @return {boolean}
174183
*/
175184
var validPalindrome = function (s) {
176-
let check = function(i, j) {
185+
const check = (i, j)=> {
177186
for (; i < j; ++i, --j) {
178-
if (s.charAt(i) !=s.charAt(j)) {
187+
if (s[i] !== s[j]) {
179188
return false;
180189
}
181190
}
182191
return true;
183192
};
184193
for (let i = 0, j = s.length - 1; i < j; ++i, --j) {
185-
if (s.charAt(i) !=s.charAt(j)) {
194+
if (s[i] !== s[j]) {
186195
return check(i + 1, j) || check(i, j - 1);
187196
}
188197
}
Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
1-
class Solution {
2-
public:
3-
bool validPalindrome(string s) {
4-
for (int i = 0, j = s.size() - 1; i < j; ++i, --j)
5-
if (s[i] != s[j])
6-
return check(s, i + 1, j) || check(s, i, j - 1);
7-
return 1;
8-
}
9-
10-
bool check(string s, int i, int j) {
11-
for (; i < j; ++i, --j)
12-
if (s[i] != s[j])
13-
return 0;
14-
return 1;
15-
}
1+
class Solution {
2+
public:
3+
bool validPalindrome(string s) {
4+
auto check = [&](int i, int j) {
5+
for (; i < j; ++i, --j) {
6+
if (s[i] != s[j]) {
7+
return false;
8+
}
9+
}
10+
return true;
11+
};
12+
for (int i = 0, j = s.size() - 1; i < j; ++i, --j) {
13+
if (s[i] != s[j]) {
14+
return check(i + 1, j) || check(i, j - 1);
15+
}
16+
}
17+
return true;
18+
}
1619
};
Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
1-
class Solution {
2-
public boolean validPalindrome(String s) {
3-
for (int i = 0, j = s.length() - 1; i < j; ++i, --j) {
4-
if (s.charAt(i) != s.charAt(j)) {
5-
return check(s, i + 1, j) || check(s, i, j - 1);
6-
}
7-
}
8-
return true;
9-
}
10-
11-
private boolean check(String s, int i, int j) {
12-
for (; i < j; ++i, --j) {
13-
if (s.charAt(i) != s.charAt(j)) {
14-
return false;
15-
}
16-
}
17-
return true;
18-
}
1+
class Solution {
2+
private String s;
3+
4+
public boolean validPalindrome(String s) {
5+
this.s = s;
6+
for (int i = 0, j = s.length() - 1; i < j; ++i, --j) {
7+
if (s.charAt(i) != s.charAt(j)) {
8+
return check(i + 1, j) || check(i, j - 1);
9+
}
10+
}
11+
return true;
12+
}
13+
14+
private boolean check(int i, int j) {
15+
for (; i < j; ++i, --j) {
16+
if (s.charAt(i) != s.charAt(j)) {
17+
return false;
18+
}
19+
}
20+
return true;
21+
}
1922
}

‎lcof2/剑指 Offer II 019. 最多删除一个字符得到回文/Solution.js‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33
* @return {boolean}
44
*/
55
var validPalindrome = function (s) {
6-
let check = function(i, j) {
6+
const check = (i, j)=> {
77
for (; i < j; ++i, --j) {
8-
if (s.charAt(i) !=s.charAt(j)) {
8+
if (s[i] !==s[j]) {
99
return false;
1010
}
1111
}
1212
return true;
1313
};
1414
for (let i = 0, j = s.length - 1; i < j; ++i, --j) {
15-
if (s.charAt(i) !=s.charAt(j)) {
15+
if (s[i] !==s[j]) {
1616
return check(i + 1, j) || check(i, j - 1);
1717
}
1818
}
Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
class Solution:
2-
def validPalindrome(self, s: str) -> bool:
3-
def check(i, j):
4-
while i < j:
5-
if s[i] != s[j]:
6-
return False
7-
i, j = i + 1, j - 1
8-
return True
9-
10-
i, j = 0, len(s) - 1
11-
while i < j:
12-
if s[i] != s[j]:
13-
return check(i, j-1) or check(i+1, j)
14-
i, j = i + 1, j - 1
15-
return True
1+
class Solution:
2+
def validPalindrome(self, s: str) -> bool:
3+
def check(i: int, j: int) ->bool:
4+
while i < j:
5+
if s[i] != s[j]:
6+
return False
7+
i, j = i + 1, j - 1
8+
return True
9+
10+
i, j = 0, len(s) - 1
11+
while i < j:
12+
if s[i] != s[j]:
13+
return check(i+1, j) or check(i, j-1)
14+
i, j = i + 1, j - 1
15+
return True

‎lcof2/剑指 Offer II 019. 最多删除一个字符得到回文/Solution.ts‎

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
function validPalindrome(s: string): boolean {
2-
for (let i: number = 0, j = s.length - 1; i < j; ++i, --j) {
3-
if (s.charAt(i) != s.charAt(j)) {
4-
return (
5-
isPalinddrome(s.slice(i, j)) ||
6-
isPalinddrome(s.slice(i + 1, j + 1))
7-
);
2+
const check = (i: number, j: number): boolean => {
3+
for (; i < j; ++i, --j) {
4+
if (s[i] !== s[j]) {
5+
return false;
6+
}
87
}
9-
}
10-
return true;
11-
}
12-
13-
function isPalinddrome(s: string): boolean {
14-
for (let i: number = 0, j = s.length - 1; i < j; ++i, --j) {
15-
if (s.charAt(i) != s.charAt(j)) {
16-
return false;
8+
return true;
9+
};
10+
for (let i = 0, j = s.length - 1; i < j; ++i, --j) {
11+
if (s[i] !== s[j]) {
12+
return check(i + 1, j) || check(i, j - 1);
1713
}
1814
}
1915
return true;

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /