Bird
Raised Fist0
DSA C++programming~5 mins

Valid Palindrome Two Pointer in DSA C++ - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Valid Palindrome Two Pointer
O(n)
Understanding Time 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 the two-pointer method affects this time.

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


bool isPalindrome(string s) {
    int left = 0, right = s.size() - 1;
    while (left < right) {
        if (!isalnum(s[left])) { left++; continue; }
        if (!isalnum(s[right])) { right--; continue; }
        if (tolower(s[left]) != 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 towards the center, skipping non-alphanumeric characters.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The while loop that moves two pointers through the string.
  • How many times: At most once per character, so up to n times where n is the string length.
How Execution Grows With Input

As the string gets longer, the number of steps grows roughly in direct proportion to its length.

Input Size (n)Approx. Operations
10About 10 checks
100About 100 checks
1000About 1000 checks

Pattern observation: The operations grow linearly with input size; doubling the string roughly doubles the work.

Final Time Complexity

Time Complexity: O(n)

This means the time to check the palindrome grows in a straight line with the length of the string.

Common Mistake

[X] Wrong: "Because there are two pointers, the time complexity is O(n²)."

[OK] Correct: Each pointer moves forward without going back, so together they only scan the string once, making it O(n), not squared.

Interview Connect

Understanding this linear time check shows you can efficiently handle strings and use two-pointer techniques, a common skill in coding challenges.

Self-Check

"What if we did not skip non-alphanumeric characters and checked every character directly? How would the time complexity change?"

Practice

(1/5)
1. What is the main idea behind the two-pointer technique to check if a string is a palindrome?
easy
A. Sort the string and check if it matches the original
B. Use two pointers starting from both ends and move towards the center comparing characters
C. Reverse the string and compare with the original
D. Count the frequency of each character and check if all are even

Solution

  1. Step 1: Understand two-pointer approach

    Two pointers start at the beginning and end of the string and move inward.
  2. Step 2: Compare characters at pointers

    If characters differ, string is not palindrome; if all match, it is palindrome.
  3. Final Answer:

    Use two pointers starting from both ends and move towards the center comparing characters -> Option B
  4. Quick Check:

    Two-pointer technique = Use two pointers starting from both ends and move towards the center comparing characters [OK]
Hint: Compare characters from ends moving inward [OK]
Common Mistakes:
  • Trying to sort string instead of comparing characters
  • Only checking half the string without pointers
  • Ignoring case or non-alphanumeric characters
2. Which of the following C++ code snippets correctly initializes two pointers for palindrome checking on string s?
easy
A. int left = 0, right = s.size() - 1;
B. int left = 1, right = s.size();
C. int left = s.size(), right = 0;
D. int left = s.size() - 1, right = 0;

Solution

  1. Step 1: Identify valid pointer initialization

    Left pointer starts at 0 (first char), right pointer at last index (size - 1).
  2. Step 2: Check each option

    int left = 0, right = s.size() - 1; correctly sets left=0 and right=s.size()-1; others have invalid indices.
  3. Final Answer:

    int left = 0, right = s.size() - 1; -> Option A
  4. Quick Check:

    Pointers start at 0 and size-1 = int left = 0, right = s.size() - 1; [OK]
Hint: Left = 0, Right = length - 1 for string indices [OK]
Common Mistakes:
  • Starting right pointer at s.size() (out of range)
  • Swapping left and right initialization
  • Starting left pointer at 1 instead of 0
3. What will be the output of the following C++ code?
std::string s = "A man, a plan, a canal: Panama";
int left = 0, right = s.size() - 1;
while (left < right) {
  while (left < right && !std::isalnum(s[left])) left++;
  while (left < right && !std::isalnum(s[right])) right--;
  if (std::tolower(s[left]) != std::tolower(s[right])) {
    std::cout << "Not Palindrome" << std::endl;
    return 0;
  }
  left++;
  right--;
}
std::cout << "Palindrome" << std::endl;
medium
A. Compilation Error
B. Not Palindrome
C. Runtime Error
D. Palindrome

Solution

  1. Step 1: Understand the code logic

    It skips non-alphanumeric chars and compares characters case-insensitively from both ends.
  2. Step 2: Check if string is palindrome ignoring cases and symbols

    "A man, a plan, a canal: Panama" is a classic palindrome ignoring spaces and punctuation.
  3. Final Answer:

    Palindrome -> Option D
  4. Quick Check:

    Ignoring non-alnum and case, string is palindrome = Palindrome [OK]
Hint: Ignore non-letters and compare lowercase chars [OK]
Common Mistakes:
  • Not skipping non-alphanumeric characters
  • Comparing characters case-sensitively
  • Confusing output with runtime or compile errors
4. Identify the bug in this palindrome check code snippet:
std::string s = "racecar";
int left = 0, right = s.size();
while (left < right) {
  if (s[left] != s[right]) {
    std::cout << "Not Palindrome" << std::endl;
    break;
  }
  left++;
  right--;
}
std::cout << "Palindrome" << std::endl;
medium
A. Right pointer initialized to s.size() which is out of range
B. Left pointer should start at 1
C. Missing tolower() for case-insensitive check
D. Loop condition should be left <= right

Solution

  1. Step 1: Check pointer initialization

    Right pointer is set to s.size(), which is one past the last valid index.
  2. Step 2: Understand consequences

    Accessing s[right] causes out-of-bounds error or undefined behavior.
  3. Final Answer:

    Right pointer initialized to s.size() which is out of range -> Option A
  4. Quick Check:

    Right pointer must be s.size()-1, not s.size() [OK]
Hint: Right pointer = length - 1 to avoid out-of-range [OK]
Common Mistakes:
  • Using s.size() as last index
  • Ignoring out-of-bounds access errors
  • Assuming loop condition fixes index error
5. Given a string s, how would you modify the two-pointer palindrome check to ignore spaces, punctuation, and be case-insensitive? Choose the best approach.
hard
A. Convert string to uppercase and compare characters including spaces
B. Reverse the string and compare directly without any changes
C. Use two pointers; skip non-alphanumeric chars; compare lowercase characters
D. Count characters frequency and check if all are even

Solution

  1. Step 1: Handle non-alphanumeric characters

    Skip spaces and punctuation by moving pointers until alphanumeric chars found.
  2. Step 2: Compare characters case-insensitively

    Convert characters to lowercase before comparing to ignore case differences.
  3. Final Answer:

    Use two pointers; skip non-alphanumeric chars; compare lowercase characters -> Option C
  4. Quick Check:

    Skip non-alnum + lowercase compare = Use two pointers; skip non-alphanumeric chars; compare lowercase characters [OK]
Hint: Skip non-letters and compare lowercase chars [OK]
Common Mistakes:
  • Comparing characters without skipping punctuation
  • Ignoring case differences
  • Using frequency count which doesn't check order
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard