Open In App

Sentence Palindrome

Last Updated : 12 Nov, 2024
Summarize
Comments
Improve
Suggest changes
Like Article
Like
Save
Share
Report
News Follow

Given a sentence s, the task is to check if it is a palindrome sentence or not. A palindrome sentence is a sequence of characters, such as a word, phrase, or series of symbols, that reads the same backward as forward after converting all uppercase letters to lowercase and removing all non-alphanumeric characters.

Examples: 

Input: s = “Too hot to hoot.”
Output: True
Explanation: If we remove all non-alphanumeric characters and convert all uppercase letters to lowercase, string s will become “toohottohoot” which is a palindrome.

Input: s = “Abc 012..## 10cbA”
Output: True
Explanation: If we remove all non-alphanumeric characters and convert all uppercase letters to lowercase, string s will become “abc01210cba” which is a palindrome.

Input: s = “ABC $. def01ASDF..”
Output: False
Explanation: If we remove all non-alphanumeric characters and convert all uppercase letters to lowercase, string s will become “abcdef01asdf” which is not a palindrome.

[Naive Approach] Comparing original and reversed strings – O(n) Time and O(n) Space

A simple approach is to create a new string containing only the alphanumeric characters of the original string. Also, in case of uppercase letters convert them to lowercase. Then, compare this new string with its reverse to know if the sentence is a palindromic sentence or not.

C++
// C++ program to check string for palindrome
// by comparing original and reversed strings

#include <algorithm>
#include <iostream>
using namespace std;

bool sentencePalindrome(string &s) {

    // create a new string having only
    // alphanumeric characters
    string s1 = "";
    for (char ch : s) {
        if (isalnum(ch)) {
            s1.push_back(tolower(ch));
        }
    }

    // find reverse of this new string
    string rev = s1;
    reverse(rev.begin(), rev.end());

    // compare string and its reverse
    return s1 == rev;
}

int main() {
    string s = "Too hot to hoot.";

    cout << (sentencePalindrome(s) ? "True" : "False") << endl;
    return 0;
}
Java
// Java program to check string for palindrome by comparing 
// original and reversed strings

import java.util.*;

class GfG {
     static boolean sentencePalindrome(String s) {
  
        // create a new string having only 
        // alphanumeric characters
        StringBuilder s1 = new StringBuilder();
        for (char ch : s.toCharArray()) {
            if (Character.isLetterOrDigit(ch)) {
                s1.append(Character.toLowerCase(ch));
            }
        }
  
        // find reverse of this new string
        StringBuilder rev = new StringBuilder(s1.toString());
        rev.reverse();
  
        // compare string and its reverse
        return s1.toString().equals(rev.toString());
    }

    public static void main(String[] args) {
        String s = "Too hot to hoot.";
  
        System.out.println(sentencePalindrome(s)
                                       ? "True" : "False");
    }
}
Python
# Python program to check string for palindrome 
# by comparing original and reversed strings

def sentencePalindrome(s):
  
    # create a new list having only 
    # alphanumeric characters
    s1 = []
    for ch in s:
        if ch.isalnum():
            s1.append(ch.lower())
    
    # Convert the new list to string
    s1 = ''.join(s1)
    
    # find reverse of this new string
    rev = s1[::-1]
    
    # compare string and its reverse
    return s1 == rev

if __name__ == "__main__":
    s = "Too hot to hoot."
    print("True" if sentencePalindrome(s) else "False")
C#
// C# program to check string for palindrome 
// by comparing original and reversed strings

using System;
using System.Text;
using System.Linq;

class GfG {
    
    // Function to check if the sentence is a palindrome
    static bool sentencePalindrome(ref string s) {
        StringBuilder s1 = new StringBuilder();
        
        // Filter out non-alphanumeric characters and 
        // convert to lowercase
        foreach (char ch in s) {
            if (Char.IsLetterOrDigit(ch)) 
                s1.Append(Char.ToLower(ch));
        }
        
        string s2 = s1.ToString();
      
          // find reverse of this new string
        char[] revArray = s2.ToCharArray().Reverse().ToArray();
        string rev = new string(revArray);
      
          // compare string and its reverse
        return s2 == rev;
    }

    static void Main() {
        string s = "Too hot to hoot.";
        Console.WriteLine(sentencePalindrome(ref s) ? "True" : "False");
    }
}
JavaScript
// JavaScript program to check string for palindrome
// by comparing original and reversed strings

function sentencePalindrome(s) {

    // create an array to store only alphanumeric characters
    let s1 = [];
    for (let i = 0; i < s.length; i++) {
        let ch = s[i];

        // Check if the character is alphanumeric
        if (/[a-zA-Z0-9]/.test(ch)) {
            s1.push(ch.toLowerCase());
        }
    }

    // find reverse of this new string by joining the array
    // into a string
    let rev = s1.slice().reverse().join("");

    // compare string and its reverse
    return s1.join("") === rev;
}

let s = "Too hot to hoot.";

console.log(sentencePalindrome(s) ? "True" : "False");

Output
True

[Expected Approach] Using Two Pointers – O(n) Time and O(1) Space

The idea is to use two pointers approach to find if a sentence is palindrome or not. Maintain one pointer at the beginning and the other at the end of the sentence. The pointers move towards each other, comparing characters along the way. If the characters match, we continue moving both pointers inward; if they differ, we return false, indicating the sentence is not a palindrome.

Also, while comparing we skip all non-alphanumeric characters. Finally, if the pointers cross each other, this means that the sentence is a palindrome.


C++
// C++ program to find if a sentence is
// palindrome using two pointers
#include <iostream>
using namespace std;

// To check sentence is palindrome or not
bool sentencePalindrome(string s) {
    int i = 0, j = s.length() - 1;

    // Compares character until they are equal
    while (i < j) {

        // Skip non alphabet character
        // from left side
        if (!isalnum(s[i]))
            i++;

        // Skip non alphabet character
        // from right side
        else if (!isalnum(s[j]))
            j--;

        // If characters are equal
        // update the pointers
        else if (tolower(s[i]) == tolower(s[j]))
            i++, j--;

        // If characters are not equal then
        // sentence is not palindrome
        else
            return false;
    }

    // Return true as sentence is palindrome
    return true;
}

int main() {
    string s = "Too hot to hoot.";

    cout << (sentencePalindrome(s) ? "True" : "False") << endl;
    return 0;
}
C
// C program to find if a sentence is
// palindrome using two pointers
#include <stdio.h>
#include <stdbool.h>

// To check sentence is palindrome or not
bool sentencePalindrome(const char* s) {
    int i = 0, j = strlen(s) - 1;

    // Compares character until they are equal
    while (i < j) {

        // Skip non alphabet character
        // from left side
        if (!isalnum(s[i]))
            i++;

        // Skip non alphabet character
        // from right side
        else if (!isalnum(s[j]))
            j--;

        // If characters are equal 
        // update the pointers
        else if (tolower(s[i]) == tolower(s[j]))
            i++, j--;

        // If characters are not equal then
        // sentence is not palindrome
        else
            return false;
    }

    // Return true as sentence is palindrome
    return true;
}

int main() {
    const char* s = "Too hot to hoot.";

    printf("%s\n", sentencePalindrome(s) ? "True" : "False");
    return 0;
}
Java
// Java program to find if a sentence is
// palindrome using two pointers
class GfG {

    // To check sentence is palindrome or not
    static boolean sentencePalindrome(String s) {
        int i = 0, j = s.length() - 1;

        // Compares character until they are equal
        while (i < j) {

            // Skip non alphabet character from left side
            if (!Character.isLetterOrDigit(s.charAt(i)))
                i++;

            // Skip non alphabet character from right side
            else if (!Character.isLetterOrDigit(s.charAt(j)))
                j--;

            // If characters are equal update the pointers
            else if (Character.toLowerCase(s.charAt(i)) 
                    == Character.toLowerCase(s.charAt(j))) {
                i++;
                j--;
            }
          
            // If characters are not equal then sentence
            // is not palindrome
            else
                return false;
        }

        // Return true as sentence is palindrome
        return true;
    }

    public static void main(String[] args) {
        String s = "Too hot to hoot.";

        System.out.println(sentencePalindrome(s) 
                           ? "True" : "False");
    }
}
Python
# Python program to find if a sentence is
# palindrome using two pointers

# To check sentence is palindrome or not
def sentencePalindrome(s):
    i, j = 0, len(s) - 1

    # Compares character until they are equal
    while i < j:

        # Skip non alphabet character
        # from left side
        if not s[i].isalnum():
            i += 1

        # Skip non alphabet character
        # from right side
        elif not s[j].isalnum():
            j -= 1

        # If characters are equal 
        # update the pointers
        elif s[i].lower() == s[j].lower():
            i += 1
            j -= 1

        # If characters are not equal then
        # sentence is not palindrome
        else:
            return False

    # Return true as sentence is palindrome
    return True

if __name__ == "__main__":
    s = "Too hot to hoot."

    print("True" if sentencePalindrome(s) else "False")
C#
// C# program to find if a sentence is
// palindrome using two pointers
using System;

class GfG {

    // To check sentence is palindrome or not
    static bool sentencePalindrome(string s) {
        int i = 0, j = s.Length - 1;

        // Compares character until they are equal
        while (i < j) {

            // Skip non alphabet character
            // from left side
            if (!char.IsLetterOrDigit(s[i]))
                i++;

            // Skip non alphabet character
            // from right side
            else if (!char.IsLetterOrDigit(s[j]))
                j--;

            // If characters are equal 
            // update the pointers
            else if (char.ToLower(s[i]) == char.ToLower(s[j])) {
                i++;
                j--;
            }

            // If characters are not equal then
            // sentence is not palindrome
            else
                return false;
        }

        // Return true as sentence is palindrome
        return true;
    }

    static void Main() {
        string s = "Too hot to hoot.";

        Console.WriteLine(sentencePalindrome(s) ? "True" : "False");
    }
}
JavaScript
// JavaScript program to find if a sentence is
// palindrome using two pointers

// To check sentence is palindrome or not
function sentencePalindrome(s) {
    let i = 0, j = s.length - 1;

    // Compares character until they are equal
    while (i < j) {

        // Skip non alphabet character
        // from left side
        if (!s[i].match(/[a-zA-Z0-9]/))
            i++;

        // Skip non alphabet character
        // from right side
        else if (!s[j].match(/[a-zA-Z0-9]/))
            j--;

        // If characters are equal
        // update the pointers
        else if (s[i].toLowerCase() === s[j].toLowerCase())
            i++, j--;

        // If characters are not equal then
        // sentence is not palindrome
        else
            return false;
    }

    // Return true as sentence is palindrome
    return true;
}

// Driver Code
let s = "Too hot to hoot.";
console.log(sentencePalindrome(s) ? "True" : "False");

Output
True




Next Article

Similar Reads

Article Tags :
Practice Tags :
three90RightbarBannerImg
  翻译: