Check if the characters in a string form a Palindrome in O(1) extra space

Given a string str. The string may contain lower-case letters, special characters, digits or even white-spaces. The task is to check, whether only the letters present in the string are forming a Palindromic combination or not without using any extra space.

Note: It is not allowed to use extra space to solve this problem. Also, the letters present in the string are in lower-case and the string may contain special characters, digits or even white-spaces along with lowercase letters.

Examples:



Input : str = “m a 343 la y a l am”
Output : YES
The characters in the string form the sequence “malayalam”, which is a palindrome.

Input : str = “malayalam”
Output : YES

Approach:

  • Create two utility functions to get the first and last position of characters present in the string.
  • Start traversing the string, and keep finding the position of first and last characters everytime.
  • If the first and last characters are same for every iteration and the string is traversed completely then print YES otherwise print NO.

Below is the implementation of above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to check if the characters in
// the given string forms a Palindrome in
// O(1) extra space
#include <iostream>
using namespace std;
  
// Utilty function to get the position of
// first character in the string
int firstPos(string str, int start, int end)
{
    int firstChar = -1;
  
    // Get the position of first character
    // in the string
    for (int i = start; i <= end; i++) {
        if (str[i] >= 'a' && str[i] <= 'z') {
            firstChar = i;
            break;
        }
    }
  
    return firstChar;
}
  
// Utilty function to get the position of
// last character in the string
int lastPos(string str, int start, int end)
{
    int lastChar = -1;
  
    // Get the position of last character
    // in the string
    for (int i = start; i >= end; i--) {
        if (str[i] >= 'a' && str[i] <= 'z') {
            lastChar = i;
            break;
        }
    }
  
    return lastChar;
}
  
// Function to check if the characters in
// the given string forms a Palindrome in
// O(1) extra space
bool isPalindrome(string str)
{
    int firstChar = 0, lastChar = str.length() - 1;
    bool ch = true;
  
    for (int i = 0; i < str.length(); i++) {
        firstChar = firstPos(str, firstChar, lastChar);
        lastChar = lastPos(str, lastChar, firstChar);
  
        // break, when all letters are checked
        if (lastChar < 0 || firstChar < 0)
            break;
        if (str[firstChar] == str[lastChar]) {
            firstChar++;
            lastChar--;
            continue;
        }
  
        // if mismatch found, break the loop
        ch = false;
        break;
    }
  
    return (ch);
}
  
// Driver code
int main()
{
    string str = "m     a  343 la y a l am";
    if (isPalindrome(str))
        cout << "YES";
    else
        cout << "NO";
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to check if 
// the characters in the given
// string forms a Palindrome 
// in O(1) extra space
import java.io.*;
  
class GFG 
{
  
// Utilty function to get 
// the position of first
// character in the string
static int firstPos(String str, 
                    int start,
                    int end)
{
    int firstChar = -1;
      
    // Get the position of 
    // first character in
    // the string
    for(int i = start; i <= end; i++)
    {
        if(str.charAt(i) >= 'a'&& 
        str.charAt(i) <= 'z')
        {
            firstChar = i;
            break;
        }
    }
      
    return firstChar;
}
  
// Utilty function to get 
// the position of last 
// character in the string
static int lastPos(String str, 
                int start, 
                int end)
{
    int lastChar = -1;
      
    // Get the position of last 
    // character in the string
    for(int i = start; i >= end; i--)
    {
        if(str.charAt(i) >= 'a'&& 
        str.charAt(i) <= 'z')
        {
            lastChar = i;
            break;
        }
    }
      
    return lastChar;
}
  
// Function to check if the 
// characters in the given 
// string forms a Palindrome 
// in O(1) extra space
static boolean isPalindrome(String str)
{
    int firstChar = 0
        lastChar = str.length() - 1;
    boolean ch = true;
  
    for (int i = 0; i < str.length(); i++) 
    {
        firstChar = firstPos(str, firstChar, 
                                lastChar);
        lastChar = lastPos(str, lastChar,
                                firstChar);
  
        // break, when all 
        // letters are checked
        if (lastChar < 0 || firstChar < 0)
            break;
        if (str.charAt(firstChar) == 
            str.charAt(lastChar)) 
        {
            firstChar++;
            lastChar--;
            continue;
        }
          
        // if mismatch found,
        // break the loop
        ch = false;
        break;
    }
  
        return ch;
  
}
  
// Driver code
public static void main (String[] args) 
{
    String str = "m a 343 la y a l am";
      
    if(isPalindrome(str))
        System.out.print("YES");
    else
    System.out.println("NO");
}
}
  
// This code is contributed 
// by inder_verma.

chevron_right


Python 3

# Python 3 program to check if the characters
# in the given string forms a Palindrome in
# O(1) extra space

# Utilty function to get the position of
# first character in the string
def firstPos(str, start, end):

firstChar = -1

# Get the position of first character
# in the string
for i in range(start, end + 1):
if (str[i] >= ‘a’ and str[i] <= 'z') : firstChar = i break return firstChar # Utilty function to get the position of # last character in the string def lastPos(str, start, end): lastChar = -1 # Get the position of last character # in the string for i in range(start, end - 1, -1) : if (str[i] >= ‘a’ and str[i] <= 'z') : lastChar = i break return lastChar # Function to check if the characters in # the given string forms a Palindrome in # O(1) extra space def isPalindrome(str): firstChar = 0 lastChar = len(str) - 1 ch = True for i in range(len(str)) : firstChar = firstPos(str, firstChar, lastChar); lastChar = lastPos(str, lastChar, firstChar); # break, when all letters are checked if (lastChar < 0 or firstChar < 0): break if (str[firstChar] == str[lastChar]): firstChar += 1 lastChar -= 1 continue # if mismatch found, break the loop ch = False break return (ch) # Driver code if __name__ == "__main__": str = "m a 343 la y a l am" if (isPalindrome(str)): print("YES") else: print("NO") # This code is contributed by ita_c [tabby title="C#"]

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to check if 
// the characters in the given
// string forms a Palindrome 
// in O(1) extra space
using System;
  
class GFG 
{
  
// Utilty function to get 
// the position of first
// character in the string
static int firstPos(string str, 
                    int start,
                    int end)
{
    int firstChar = -1;
      
    // Get the position of 
    // first character in
    // the string
    for(int i = start; i <= end; i++)
    {
        if(str[i] >= 'a'&& 
           str[i] <= 'z')
        {
            firstChar = i;
            break;
        }
    }
      
    return firstChar;
}
  
// Utilty function to get 
// the position of last 
// character in the string
static int lastPos(string str, 
                   int start, 
                   int end)
{
    int lastChar = -1;
      
    // Get the position of last 
    // character in the string
    for(int i = start; i >= end; i--)
    {
        if(str[i] >= 'a'&& 
           str[i] <= 'z')
        {
            lastChar = i;
            break;
        }
    }
      
    return lastChar;
}
  
// Function to check if the 
// characters in the given 
// string forms a Palindrome 
// in O(1) extra space
static bool isPalindrome(string str)
{
    int firstChar = 0, 
        lastChar = str.Length - 1;
    bool ch = true;
  
    for (int i = 0; i < str.Length; i++) 
    {
        firstChar = firstPos(str, firstChar, 
                                  lastChar);
        lastChar = lastPos(str, lastChar,
                                firstChar);
  
        // break, when all 
        // letters are checked
        if (lastChar < 0 || firstChar < 0)
            break;
        if (str[firstChar] == 
            str[lastChar]) 
        {
            firstChar++;
            lastChar--;
            continue;
        }
          
        // if mismatch found,
        // break the loop
        ch = false;
        break;
    }
  
        return ch;
}
  
// Driver code
public static void Main () 
{
    string str = "m a 343 la y a l am";
      
    if(isPalindrome(str))
        Console.WriteLine("YES");
    else
        Console.WriteLine("NO");
}
}
  
// This code is contributed 
// by inder_verma.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to check if the 
// characters in the given 
// string forms a Palindrome 
// in O(1) extra space
  
// Utilty function to get the 
// position of first character
// in the string
function firstPos($str, $start, $end)
{
    $firstChar = -1;
  
    // Get the position of first 
    // character in the string
    for ($i = $start; $i <= $end; $i++) 
    {
        if ($str[$i] >= 'a' and
            $str[$i] <= 'z'
        {
            $firstChar = $i;
            break;
        }
    }
  
    return $firstChar;
}
  
// Utilty function to get the 
// position of last character
// in the string
function lastPos($str, $start, $end)
{
    $lastChar = -1;
  
    // Get the position of last 
    // character in the string
    for ( $i = $start; $i >= $end; $i--) 
    {
        if ($str[$i] >= 'a' and 
            $str[$i] <= 'z'
        {
            $lastChar = $i;
            break;
        }
    }
  
    return $lastChar;
}
  
// Function to check if the 
// characters in the given 
// string forms a Palindrome 
// in O(1) extra space
function isPalindrome($str)
{
    $firstChar = 0; 
    $lastChar = count($str) - 1;
    $ch = true;
  
    for ($i = 0; $i < count($str); $i++) 
    {
        $firstChar = firstPos($str, $firstChar
                                    $lastChar);
        $lastChar = lastPos($str, $lastChar
                                  $firstChar);
  
        // break, when all letters are checked
        if ($lastChar < 0 or $firstChar < 0)
            break;
        if ($str[$firstChar] == $str[$lastChar])
        {
            $firstChar++;
            $lastChar--;
            continue;
        }
  
        // if mismatch found,
        // break the loop
        $ch = false;
        break;
    }
  
    return ($ch);
}
  
// Driver code
$str = "m a 343 la y a l am";
if (isPalindrome($str))
    echo "YES";
else
    echo "NO";
  
// This code is contributed 
// by inder_verma.
?>

chevron_right


Output:

YES


My Personal Notes arrow_drop_up


If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : inderDuMCA, Ita_c