Valid Palindrome Two Pointer in DSA Typescript - Time & Space Complexity
We want to know how the time needed to check if a string is a palindrome grows as the string gets longer.
How does the number of steps change when the input string size increases?
Analyze the time complexity of the following code snippet.
function isPalindrome(s: string): boolean {
let left = 0;
let right = s.length - 1;
while (left < right) {
while (left < right && !isAlphaNumeric(s[left])) left++;
while (left < right && !isAlphaNumeric(s[right])) right--;
if (s[left].toLowerCase() !== s[right].toLowerCase()) return false;
left++;
right--;
}
return true;
}
function isAlphaNumeric(c: string): boolean {
return /[a-z0-9]/i.test(c);
}
This code checks if a string is a palindrome by using two pointers moving towards the center, skipping non-alphanumeric characters.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that moves two pointers from the ends towards the center.
- How many times: Each character is checked at most once by either pointer, so up to n times where n is string length.
As the string gets longer, the number of steps grows roughly in a straight line with the string length.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: The steps increase directly with input size, doubling input roughly doubles work.
Time Complexity: O(n)
This means the time to check grows in a straight line with the length of the string.
[X] Wrong: "Because there are nested while loops, the time must be quadratic O(n²)."
[OK] Correct: The inner loops only skip non-alphanumeric characters and each character is visited once total, so the total work is still linear.
Understanding this linear time approach shows you can efficiently handle string checks with two pointers, a common and useful skill in many coding problems.
"What if we removed the checks for non-alphanumeric characters? How would the time complexity change?"
Practice
Solution
Step 1: Understand two-pointer approach
Two pointers start at the beginning and end of the string and move inward.Step 2: Compare characters at pointers
If characters at both pointers match, move pointers closer; otherwise, it's not a palindrome.Final Answer:
Use two pointers starting at both ends and move towards the center comparing characters -> Option CQuick Check:
Two-pointer palindrome check = Use two pointers starting at both ends and move towards the center comparing characters [OK]
- Reversing string instead of using pointers
- Checking only half the string without pointers
- Ignoring case or non-alphanumeric characters
Solution
Step 1: Identify pointer positions
Left pointer should start at index 0 (start of string), right pointer at last index (length - 1).Step 2: Check code correctness
let left = 0; let right = s.length - 1; correctly sets left = 0 and right = s.length - 1, valid indices for string.Final Answer:
let left = 0; let right = s.length - 1; -> Option AQuick Check:
Pointers start at 0 and length-1 = let left = 0; let right = s.length - 1; [OK]
- Setting right pointer to s.length (out of bounds)
- Starting left pointer at 1 instead of 0
- Confusing length with last index
function isPalindrome(s: string): boolean {
let left = 0;
let right = s.length - 1;
while (left < right) {
if (s[left] !== s[right]) return false;
left++;
right--;
}
return true;
}
console.log(isPalindrome('racecar'));
console.log(isPalindrome('hello'));Solution
Step 1: Trace 'racecar' input
Characters match from both ends moving inward, so returns true.Step 2: Trace 'hello' input
Characters 'h' and 'o' differ at ends, returns false immediately.Final Answer:
true false -> Option AQuick Check:
'racecar' palindrome = true, 'hello' not = false [OK]
- Assuming 'hello' is palindrome
- Returning true without checking all pairs
- Off-by-one errors in pointer movement
function isPalindrome(s: string): boolean {
let left = 0;
let right = s.length;
while (left < right) {
if (s[left] !== s[right]) return false;
left++;
right--;
}
return true;
}Solution
Step 1: Check pointer initialization
Right pointer is set to s.length, which is out of string index range (0 to length-1).Step 2: Understand impact of bug
Accessing s[s.length] causes undefined comparison or runtime error.Final Answer:
right pointer initialized to s.length instead of s.length - 1 -> Option BQuick Check:
Right pointer must be last index = length-1 [OK]
- Using s.length as index causes out-of-bounds
- Changing loop condition incorrectly
- Confusing equality and inequality in comparison
s = "A man, a plan, a canal: Panama", which modification is needed in the two-pointer palindrome check to correctly identify it as a palindrome?Solution
Step 1: Understand input complexity
String contains spaces, commas, and mixed case letters which must be ignored for palindrome check.Step 2: Modify two-pointer logic
Skip non-alphanumeric characters and compare characters case-insensitively while moving pointers inward.Final Answer:
Ignore case and skip non-alphanumeric characters during comparison -> Option DQuick Check:
Skip non-letters and ignore case for valid palindrome [OK]
- Comparing characters without ignoring punctuation
- Not converting characters to same case
- Assuming direct comparison works on raw string
Ready to prove it?
Pass the test and this pattern moves unknown
