Skip to content

Commit 55040a8

Browse files
authored
[Two Pointers][Valid Palindrome] - Implement solution for Leetcode 125 (#15)
1 parent 2118da1 commit 55040a8

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package validpalindrome
2+
3+
// Time complexity: O(n)
4+
// Space complexity: O(n)
5+
func IsPalindromeReverseString(s string) bool {
6+
clean := make([]rune, 0, len(s))
7+
for _, r := range s {
8+
if (r >= 'a' && r <= 'z') || (r >= '0' && r <= '9') {
9+
clean = append(clean, r)
10+
} else if r >= 'A' && r <= 'Z' {
11+
clean = append(clean, r+32)
12+
}
13+
}
14+
n := len(clean)
15+
for i := 0; i < n/2; i++ {
16+
if clean[i] != clean[n-1-i] {
17+
return false
18+
}
19+
}
20+
return true
21+
}
22+
23+
// Time complexity: O(n)
24+
// Space complexity: O(1)
25+
func IsPalindromeTwoPointers(s string) bool {
26+
left, right := 0, len(s)-1
27+
for left < right {
28+
for left < right && !((s[left] >= 'a' && s[left] <= 'z') || (s[left] >= 'A' && s[left] <= 'Z') || (s[left] >= '0' && s[left] <= '9')) {
29+
left++
30+
}
31+
for left < right && !((s[right] >= 'a' && s[right] <= 'z') || (s[right] >= 'A' && s[right] <= 'Z') || (s[right] >= '0' && s[right] <= '9')) {
32+
right--
33+
}
34+
l := s[left]
35+
r := s[right]
36+
if l >= 'A' && l <= 'Z' {
37+
l += 32
38+
}
39+
if r >= 'A' && r <= 'Z' {
40+
r += 32
41+
}
42+
if l != r {
43+
return false
44+
}
45+
left++
46+
right--
47+
}
48+
return true
49+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package validpalindrome
2+
3+
import "testing"
4+
5+
func TestIsPalindrome(t *testing.T) {
6+
cases := []struct {
7+
name string
8+
fn func(string) bool
9+
s string
10+
expected bool
11+
}{
12+
// IsPalindromeReverseString
13+
{"Reverse String - Palindrome with spaces/punctuations", IsPalindromeReverseString, "Was it a car or a cat I saw?", true},
14+
{"Reverse String - Not a palindrome", IsPalindromeReverseString, "tab a cat", false},
15+
{"Reverse String - Single character", IsPalindromeReverseString, "a", true},
16+
{"Reverse String - Empty string", IsPalindromeReverseString, "", true},
17+
{"Reverse String - Mixed case palindrome", IsPalindromeReverseString, "Able was I ere I saw Elba", true},
18+
{"Reverse String - Only non-alphanumeric", IsPalindromeReverseString, "!!!", true},
19+
{"Reverse String - Palindrome with numbers", IsPalindromeReverseString, "12321", true},
20+
{"Reverse String - Not palindrome with numbers", IsPalindromeReverseString, "12345", false},
21+
22+
// IsPalindromeTwoPointers
23+
{"Two Pointers - Palindrome with spaces/punctuations", IsPalindromeTwoPointers, "Was it a car or a cat I saw?", true},
24+
{"Two Pointers - Not a palindrome", IsPalindromeTwoPointers, "tab a cat", false},
25+
{"Two Pointers - Single character", IsPalindromeTwoPointers, "a", true},
26+
{"Two Pointers - Empty string", IsPalindromeTwoPointers, "", true},
27+
{"Two Pointers - Mixed case palindrome", IsPalindromeTwoPointers, "Able was I ere I saw Elba", true},
28+
{"Two Pointers - Only non-alphanumeric", IsPalindromeTwoPointers, "!!!", true},
29+
{"Two Pointers - Palindrome with numbers", IsPalindromeTwoPointers, "12321", true},
30+
{"Two Pointers - Not palindrome with numbers", IsPalindromeTwoPointers, "12345", false},
31+
}
32+
33+
for _, c := range cases {
34+
t.Run(c.name, func(t *testing.T) {
35+
got := c.fn(c.s)
36+
if got != c.expected {
37+
t.Errorf("%s failed: expected %v, got %v", c.name, c.expected, got)
38+
}
39+
})
40+
}
41+
}

0 commit comments

Comments
 (0)