Skip to content

Commit 26c5865

Browse files
committed
Refactor solution to the Valid Palindrome II
1 parent e9253b8 commit 26c5865

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

String/ValidPalindromeII.swift

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,40 @@
11
/**
22
* Question Link: https://leetcode.com/problems/valid-palindrome-ii/
3-
* Primary idea: Take advantage of validPalindrome, and jump left and right separately to get correct character should be deleted
3+
* Primary idea: Two pointers. Move left and right when they are equal or cannot separate by moving either side, otherwise move one direction and update the flag.
44
*
5-
* Time Complexity: O(n), Space Complexity: O(n)
5+
* Time Complexity: O(n), Space Complexity: O(1)
66
*
77
*/
88

99
class ValidPalindromeII {
1010
func validPalindrome(_ s: String) -> Bool {
11+
var i = 0, j = s.count - 1, isDeleted = false
1112
let s = Array(s)
12-
return isValid(true, s) || isValid(false, s)
13-
}
14-
15-
private func isValid(_ skipLeft: Bool, _ s: [Character]) -> Bool {
16-
var i = 0, j = s.count - 1, alreadySkipped = false
17-
13+
1814
while i < j {
19-
if s[i] == s[j] {
20-
i += 1
21-
j -= 1
22-
} else {
23-
if alreadySkipped {
15+
if s[i] != s[j] {
16+
if isDeleted {
2417
return false
2518
} else {
26-
alreadySkipped = true
27-
if skipLeft {
28-
i += 1
29-
} else {
19+
if s[i + 1] == s [j] && s[j - 1] == s[i] {
20+
i += 1
3021
j -= 1
22+
} else if s[i + 1] == s[j] {
23+
i += 1
24+
isDeleted = true
25+
} else if s[j - 1] == s[i] {
26+
j -= 1
27+
isDeleted = true
28+
} else {
29+
return false
3130
}
3231
}
32+
} else {
33+
i += 1
34+
j -= 1
3335
}
3436
}
35-
37+
3638
return true
3739
}
3840
}

0 commit comments

Comments
 (0)