logo

Java program pro kontrolu, zda je řetězec Palindrom

Řetězec se nazývá palindrom, pokud je stejný, pokud jej začneme číst zleva doprava nebo zprava doleva. V tomto článku se naučíme, jak zkontrolovat, zda je řetězec palindrom v Javě.

Zvažme tedy řetězec str , nyní je úkolem pouze zjistit, zda je jeho obrácený řetězec stejný jako on.



Příklad Palindromu:

Vstup: str = abba
Výstup: Ano

Vstup: str = geekové
Výstup: Ne

Metody pro palindromový řetězec v Javě

Existují tři hlavní způsoby kontroly palindromu řetězců v Javě, jak je uvedeno níže:



java string indexof
  1. Naivní metoda
  2. Metoda dvou ukazatelů
  3. Rekurzivní metoda
  4. Pomocí StringBuilderu

1. Naivní přístup ke kontrole řetězce palindromu v Javě

Obrácením daného řetězce a porovnáním. Zda je daný řetězec palindrom, můžeme ověřit porovnáním původního řetězce s jeho obrácenou verzí.

Níže je uvedena implementace výše uvedeného přístupu:

Jáva
// Java Program to implement // Basic Approach to check if // string is a Palindrome import java.io.*; // Driver Class class GFG { // main function public static boolean isPalindrome(String str) { // Initializing an empty string to store the reverse // of the original str String rev = ''; // Initializing a new boolean variable for the // answer boolean ans = false; for (int i = str.length() - 1; i>= 0; i--) { rev = rev + str.charAt(i); } // Kontrola, zda jsou oba řetězce stejné if (str.equals(rev)) { ans = true; } return ans; } public static void main(String[] args) { // Vstupní řetězec String str = 'geeks'; // Převede řetězec na malá písmena str = str.toLowerCase(); boolean A = isPalindrome(str); System.out.println(A); } }>

Výstup
false>

Složitost výše uvedené metody:

Časová náročnost: Časová složitost daného kódu je O(n), kde n je délka vstupního řetězce. Je to proto, že smyčka for iteruje každý znak v řetězci jednou, aby vytvořila obrácený řetězec.



Prostorová složitost: Prostorová složitost kódu je O(n), kde n je délka vstupního řetězce. Reverzní řetězec je totiž vytvořen a uložen v samostatné řetězcové proměnné, která zabírá místo v paměti úměrně délce vstupního řetězce. Kromě toho ostatní proměnné použité v kódu (i, str a ans) zabírají konstantní množství místa, které je nezávislé na velikosti vstupu.

Ve výše uvedeném příkladu, pokud píšeme ABba namísto abba , pak bychom také měli dostat výstup jako Ano . Takže musíme změnit velikost písmen řetězce na malá nebo velká písmena, než v něm zkontrolujeme palindrom. Pokud to neuděláme, dostaneme neočekávané výsledky. Je to proto, že kompilátor kontroluje znaky na základě jejich ASCII hodnotu a ASCII hodnota A není totéž jako A .

ctc plná forma

2. Přístup dvou ukazatelů pro P alindrome program v Javě

Náš přístup bude takový, že nejdříve převedeme řetězec na malá písmena. Pak vezmeme dva ukazatele i ukazující na začátek řetězce a j ukazující na konec řetězce. Pokračujte ve zvyšování i a dekrementování j zatímco i a v každém kroku zkontrolujte, zda jsou znaky na těchto ukazatelích stejné nebo ne. Pokud ne, pak řetězec není palindrom, ale je.

Příklad 1:

prázdno 0
Jáva
// Java program to check whether a // string is a Palindrome // Using two pointing variables // Main class public class GFG { // Method // Returning true if string is palindrome static boolean isPalindrome(String str) { // Pointers pointing to the beginning // and the end of the string int i = 0, j = str.length() - 1; // While there are characters to compare while (i < j) { // If there is a mismatch if (str.charAt(i) != str.charAt(j)) return false; // Increment first pointer and // decrement the other i++; j--; } // Given string is a palindrome return true; } // Method 2 // main driver method public static void main(String[] args) { // Input string String str = 'geeks'; // Convert the string to lowercase str = str.toLowerCase(); // passing bool function till holding true if (isPalindrome(str)) // It is a palindrome System.out.print('Yes'); else // Not a palindrome System.out.print('No'); } }>

Výstup
No>

Složitost výše uvedené metody:

Časová náročnost: Časová složitost daného kódu je O(n), kde n je délka vstupního řetězce. Je to proto, že smyčka while iteruje polovinu řetězce, aby zkontrolovala, zda se jedná o palindrom. Protože kontrolujeme pouze polovinu řetězce, počet iterací je úměrný n/2, což je O(n).

Prostorová složitost: Prostorová složitost kódu je O(1), protože kód používá pouze konstantní množství dalšího prostoru, který je nezávislý na velikosti vstupu. Jediné proměnné použité v kódu jsou i, j a str, z nichž každá zabírá konstantní množství místa. V kódu není vytvořen žádný další prostor.

Příklad 2:

Jáva
// Java Program to check Whether // the String is Palindrome // or Not // Main class class GFG { // Method 1 // Returns true if string is a palindrome static boolean isPalindrome(String str) { // Pointers pointing to the beginning // and the end of the string int i = 0, j = str.length() - 1; // While there are characters to compare while (i < j) { // If there is a mismatch if (str.charAt(i) != str.charAt(j)) return false; // Increment first pointer and // decrement the other i++; j--; } // Given string is a palindrome return true; } // Main driver method public static void main(String[] args) { String str = 'geeks'; String str2 = 'RACEcar'; // Change strings to lowercase str = str.toLowerCase(); str2 = str2.toLowerCase(); // For string 1 System.out.print('String 1 :'); if (isPalindrome(str)) System.out.print('It is a palindrome'); else System.out.print('It is not a palindrome'); // new line for better readability System.out.println(); // For string 2 System.out.print('String 2 :'); if (isPalindrome(str2)) System.out.print('It is a palindrome'); else System.out.print('It is not a palindrome'); } }>

Výstup
String 1 :It is not a palindrome String 2 :It is a palindrome>

Složitost výše uvedené metody:

Časová náročnost: Časová složitost daného kódu je O(n), kde n je délka vstupního řetězce. Je to proto, že smyčka while v metodě `isPalindrome` iteruje polovinu řetězce, aby zkontrolovala, zda se jedná o palindrom. Protože kontrolujeme pouze polovinu řetězce, počet iterací je úměrný n/2, což je O(n).

Prostorová složitost: Prostorová složitost kódu je O(1), protože kód používá pouze konstantní množství dalšího prostoru, který je nezávislý na velikosti vstupu. Jediné proměnné použité v kódu jsou i, j, str a str2, z nichž každá zabírá konstantní množství místa. V kódu není vytvořen žádný další prostor.

3. Rekurzivní přístup pro P alindrome program v Javě

Přístup je velmi jednoduchý. Stejně jako u dvoubodového přístupu zkontrolujeme první a poslední hodnotu řetězce, ale tentokrát to bude pomocí rekurze.

  • Vezmeme dva ukazatele i ukazující na začátek řetězce a j ukazující na konec řetězce.
  • Pokračujte ve zvyšování i a snižování j, zatímco i
  • Zkontrolujte, zda jsou znaky na těchto ukazatelích stejné nebo ne. Děláme to pomocí rekurze – (i+1, j-1
  • Pokud jsou všechny znaky na i-tém a j-tém indexu stejné, dokud nesplní podmínka i>=j, vytiskne true, jinak false.

Níže je uvedena implementace výše uvedeného přístupu:

rozhraní vs abstraktní třída
Jáva
// Java program to check whether a // string is a Palindrome using recursion import java.io.*; // Driver Class class GFG { public static boolean isPalindrome(int i, int j, String A) { // comparing the two pointers if (i>= j) { return true; } // porovnání znaků na těchto ukazatelích if (A.charAt(i) != A.charAt(j)) { return false; } // vše znovu rekurzivně zkontrolujeme return isPalindrome(i + 1, j - 1, A); } public static boolean isPalindrome(String A) { return isPalindrome(0, A.length() - 1, A); } // hlavní funkce public static void main(String[] args) { // Vstupní řetězec String A = 'geeks'; // Převede řetězec na malá písmena A = A.toLowerCase(); boolean str = isPalindrome(A); System.out.println(str); } }>

Výstup
false>

Složitost výše uvedené metody:

Časová náročnost: Časová složitost daného kódu je O(n), kde n je délka vstupního řetězce. Je to proto, že funkce `isPalindrome` rekurzivně volá sama sebe pro znaky na pozicích (i+1, j-1), dokud se ukazatele i a j vzájemně nekříží nebo si znaky na ukazatelích nejsou stejné. Protože každý znak v řetězci porovnáváme právě jednou, je časová složitost O(n).

Prostorová složitost: Prostorová složitost kódu je O(n), kde n je délka vstupního řetězce. Je to proto, že každé rekurzivní volání vytváří nový zásobníkový rámec, který ukládá aktuální hodnoty parametrů funkce a lokálních proměnných. V nejhorším případě může zásobník volání funkcí narůst až na n/2 (když je vstupním řetězcem palindrom), takže prostorová složitost je O(n).

4. Použití StringBuilder Approach v Javě

V tomto přístupu

  • Nejprve převezmeme vstup String od uživatele.
  • Poté vytvoříme objekt Stringbuilder str1″ a uložíme do něj hodnotu String.
  • Metoda reverse() v Stringbuider nám poskytuje obrácený řetězec. Ee uložte ten obrácený řetězec v str1.
  • Pomocí metody equals() porovnáváme hodnoty řetězce, pomocí if a else condition check jsou hodnoty řetězce podobné nebo ne.

Níže je uvedena implementace výše uvedeného přístupu:

Jáva
import java.util.Scanner; public class Main { public static void main(String[] args) { String str = 'GeeksForGeeks'; // String for testing StringBuilder str1 = new StringBuilder(str); str1.reverse(); if (str.equals(str1.toString())) { System.out.println('Palindrome String'); } else { System.out.println('Not a palindrome String'); } } }>

Výstup
Not a palindrome String>

Složitost výše uvedeného kódu:

číslo 1 milion

Časová náročnost: Časová složitost kódu je O(n), kde n je opět délka vstupního řetězce str. Primárním faktorem přispívajícím k této časové složitosti je obrácení řetězce pomocí str1.reverse(). Obrácení řetězce tímto způsobem má časovou složitost O(n), kde n je délka řetězce. Ostatní operace v kódu, jako je čtení vstupu a porovnávání řetězců, jsou operace s konstantním časem a nemají významný vliv na celkovou časovou složitost.

Prostorová složitost: Prostorová složitost daného Java kódu je O(n), kde n je délka vstupního řetězce str. Důvodem je, že kód používá StringBuilder k uložení obrácené kopie vstupního řetězce a prostor požadovaný pro StringBuilder je úměrný délce vstupního řetězce.

Odkaz

Chcete-li se dozvědět více o Palindromu, viz Program pro String Palindrom .