Valid Palindrome Two Pointer in DSA C# - 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.
Specifically, how many steps does the two-pointer method take as input size increases?
Analyze the time complexity of the following code snippet.
public bool IsPalindrome(string s) {
int left = 0, right = s.Length - 1;
while (left < right) {
if (!char.IsLetterOrDigit(s[left])) { left++; continue; }
if (!char.IsLetterOrDigit(s[right])) { right--; continue; }
if (char.ToLower(s[left]) != char.ToLower(s[right])) return false;
left++;
right--;
}
return true;
}
This code checks if a string is a palindrome by moving two pointers from both ends toward the center, skipping non-alphanumeric characters.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that moves two pointers inward checking characters.
- How many times: At most, each character is visited once by either pointer, so up to n times where n is string length.
As the string length grows, the number of steps grows roughly in a straight line with it.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: Doubling the input roughly doubles the work done.
Time Complexity: O(n)
This means the time to check grows directly in proportion to the string length.
[X] Wrong: "Because there are two pointers, the time is doubled or squared."
[OK] Correct: Both pointers move inward and together visit each character only once, so total work is still proportional to n, not n squared.
Understanding this linear time check is a great skill for interviews, showing you can analyze simple but efficient string algorithms clearly.
"What if we changed the code to check every character against every other character? How would the time complexity change?"
Practice
Solution
Step 1: Understand the 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 are equal, move pointers closer; if not, string is not palindrome.Final Answer:
Use two pointers starting from both ends and move towards the center comparing characters -> Option DQuick Check:
Two-pointer technique = Compare ends inward [OK]
- Reversing string instead of using pointers
- Checking only half the string incorrectly
- Ignoring case or non-alphanumeric characters
s?Solution
Step 1: Identify valid pointer initialization
Left pointer starts at 0 (first char), right pointer at s.Length - 1 (last char).Step 2: Check each option
int left = 0, right = s.Length - 1; correctly sets left=0 and right=s.Length-1; others are off by one.Final Answer:
int left = 0, right = s.Length - 1; -> Option AQuick Check:
Pointers start at 0 and last index [OK]
- Setting right pointer to s.Length (out of range)
- Starting left pointer at 1 instead of 0
- Confusing length with last index
string s = "A man, a plan, a canal: Panama";
bool IsPalindrome(string str) {
int left = 0, right = str.Length - 1;
while (left < right) {
if (!char.IsLetterOrDigit(str[left])) { left++; continue; }
if (!char.IsLetterOrDigit(str[right])) { right--; continue; }
if (char.ToLower(str[left]) != char.ToLower(str[right])) return false;
left++; right--;
}
return true;
}
Console.WriteLine(IsPalindrome(s));Solution
Step 1: Understand the code logic
The code skips non-alphanumeric characters and compares letters ignoring case.Step 2: Analyze the input string
"A man, a plan, a canal: Panama" is a famous palindrome ignoring spaces and punctuation.Final Answer:
True -> Option BQuick Check:
Ignoring punctuation and case, string is palindrome [OK]
- Not skipping non-alphanumeric characters
- Comparing characters without case normalization
- Assuming spaces affect palindrome check
bool IsPalindrome(string s) {
int left = 0, right = s.Length - 1;
while (left <= right) {
if (s[left] != s[right]) return false;
left++;
right--;
}
return true;
}Solution
Step 1: Check loop condition correctness
Using <= causes unnecessary comparison when left == right; < is better.Step 2: Consider case and character filtering
Comparisons should ignore case and skip non-alphanumeric chars for valid palindrome check.Step 3: Combine fixes
All suggested fixes improve correctness and handle common palindrome cases.Final Answer:
All of the above -> Option CQuick Check:
Loop, case, and filtering fixes needed [OK]
- Using <= instead of < in loop
- Ignoring case differences
- Not skipping punctuation or spaces
"No lemon, no melon", which modification to the two-pointer palindrome check is necessary to correctly identify it as a palindrome?Solution
Step 1: Analyze the string content
"No lemon, no melon" contains spaces and punctuation that should be ignored.Step 2: Determine necessary preprocessing
Lowercase conversion and skipping all non-alphanumeric characters ensures correct palindrome check.Final Answer:
Convert characters to lowercase and skip non-alphanumeric characters during comparison -> Option AQuick Check:
Lowercase + skip non-alphanumeric = correct palindrome check [OK]
- Skipping only spaces but not punctuation
- Ignoring case differences
- Comparing raw strings without preprocessing
Ready to prove it?
Pass the test and this pattern moves unknown
