logo

Java program na kontrolu, či je reťazec Palindróm

Reťazec sa nazýva palindróm, ak je rovnaký, ak ho začneme čítať zľava doprava alebo sprava doľava. V tomto článku sa naučíme, ako skontrolovať, či je reťazec palindróm v Jave.

Uvažujme teda o reťazci str , teraz je úlohou len zistiť, či je jeho reverzný reťazec rovnaký ako on.



Príklad palindrómu:

Vstup: str = abba
Výkon: Áno

Vstup: str = geekovia
Výkon: Nie

Metódy pre palindrómový reťazec v Jave

Existujú tri hlavné metódy na kontrolu palindrómu reťazcov v jazyku Java, ako je uvedené nižšie:



synchronizácia java
  1. Naivná metóda
  2. Metóda dvoch ukazovateľov
  3. Rekurzívna metóda
  4. Použitie StringBuilder

1. Naivný prístup ku kontrole palindrómového reťazca v jazyku Java

Obrátením daného reťazca a porovnaním. Či je daný reťazec palindróm, môžeme skontrolovať porovnaním pôvodného reťazca s jeho obrátenou verziou.

pd.merge

Nižšie je uvedená implementácia vyššie uvedeného prístupu:

Java
// 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, či sú oba reťazce rovnaké if (str.equals(rev)) { ans = true; } return ans; } public static void main(String[] args) { // Vstupný reťazec String str = 'geeks'; // Prevod reťazca na malé písmená str = str.toLowerCase(); boolean A = isPalindrome(str); System.out.println(A); } }>

Výkon
false>

Zložitosť vyššie uvedenej metódy:

Časová zložitosť: Časová zložitosť daného kódu je O(n), kde n je dĺžka vstupného reťazca. Je to preto, že cyklus for iteruje každý znak v reťazci raz, aby vytvoril reverzný reťazec.



Priestorová zložitosť: Priestorová zložitosť kódu je O(n), kde n je dĺžka vstupného reťazca. Je to preto, že reverzný reťazec je vytvorený a uložený v samostatnej reťazcovej premennej, ktorá zaberá miesto v pamäti úmerne dĺžke vstupného reťazca. Okrem toho ostatné premenné použité v kóde (i, str a ans) zaberajú konštantné množstvo miesta, ktoré je nezávislé od veľkosti vstupu.

Vo vyššie uvedenom príklade, ak píšeme ABba namiesto abba , potom by sme tiež mali dostať výstup ako Áno . Takže musíme zmeniť veľkosť písmen reťazca na malé alebo veľké písmená predtým, ako v ňom skontrolujeme palindróm. Ak to neurobíme, dostaneme neočakávané výsledky. Je to preto, že kompilátor kontroluje znaky na základe ich ASCII hodnotu a ASCII hodnota A nie je to isté ako a .

2. Dvojukazový prístup pre P alindrome program v Jave

Náš prístup bude taký, že najprv reťazec prevedieme na malé písmená. Potom vezmeme dva ukazovatele i ukazujúce na začiatok reťazca a j ukazujúce na koniec reťazca. Pokračujte v zvyšovaní i a znižovanie j zatiaľ čo i a pri každom kroku skontrolujte, či sú znaky na týchto ukazovateľoch rovnaké alebo nie. Ak nie, reťazec nie je palindróm, ale je.

Príklad 1:

Java
// 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ýkon
No>

Zložitosť vyššie uvedenej metódy:

Časová zložitosť: Časová zložitosť daného kódu je O(n), kde n je dĺžka vstupného reťazca. Je to preto, že cyklus while iteruje cez polovicu reťazca, aby skontroloval, či ide o palindróm. Keďže kontrolujeme len polovicu reťazca, počet iterácií je úmerný n/2, čo je O(n).

príkaz java case

Priestorová zložitosť: Priestorová zložitosť kódu je O(1), pretože kód používa iba konštantné množstvo dodatočného priestoru, ktorý je nezávislý od veľkosti vstupu. Jediné premenné použité v kóde sú i, j a str, z ktorých každá zaberá konštantné množstvo miesta. V kóde nie je vytvorený žiadny ďalší priestor.

Príklad 2:

Java
// 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ýkon
String 1 :It is not a palindrome String 2 :It is a palindrome>

Zložitosť vyššie uvedenej metódy:

Časová zložitosť: Časová zložitosť daného kódu je O(n), kde n je dĺžka vstupného reťazca. Je to preto, že cyklus while v metóde „isPalindrome“ iteruje polovicu reťazca, aby skontroloval, či ide o palindróm. Keďže kontrolujeme len polovicu reťazca, počet iterácií je úmerný n/2, čo je O(n).

Priestorová zložitosť: Priestorová zložitosť kódu je O(1), pretože kód používa iba konštantné množstvo dodatočného priestoru, ktorý je nezávislý od veľkosti vstupu. Jediné premenné použité v kóde sú i, j, str a str2, z ktorých každá zaberá konštantné množstvo miesta. V kóde nie je vytvorený žiadny ďalší priestor.

3. Rekurzívny prístup pre P alindrome program v Jave

Prístup je veľmi jednoduchý. Rovnako ako pri dvojbodovom prístupe skontrolujeme prvú a poslednú hodnotu reťazca, ale tentoraz to bude prostredníctvom rekurzie.

  • Vezmeme dva ukazovatele i ukazujúce na začiatok reťazca a j ukazujúce na koniec reťazca.
  • Neustále zvyšujte i a znižujte j, zatiaľ čo i
  • Skontrolujte, či sú znaky na týchto ukazovateľoch rovnaké alebo nie. Robíme to prostredníctvom rekurzie – (i+1, j-1
  • Ak sú všetky znaky rovnaké na i-tom a j-tom indexe, kým nesplní podmienka i>=j, vypíše sa pravda, inak nepravda.

Nižšie je uvedená implementácia vyššie uvedeného prístupu:

Java
// 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; } // porovnanie znakov na týchto ukazovateľoch if (A.charAt(i) != A.charAt(j)) { return false; } // všetko znova rekurzívne skontrolujeme return isPalindrome(i + 1, j - 1, A); } public static boolean isPalindrome(String A) { return isPalindrome(0, A.length() - 1, A); } // hlavná funkcia public static void main(String[] args) { // Vstupný reťazec String A = 'geeks'; // Prevod reťazca na malé písmená A = A.toLowerCase(); boolean str = isPalindrome(A); System.out.println(str); } }>

Výkon
false>

Zložitosť vyššie uvedenej metódy:

Časová zložitosť: Časová zložitosť daného kódu je O(n), kde n je dĺžka vstupného reťazca. Je to preto, že funkcia `isPalindrome` sa rekurzívne volá po znakoch na pozíciách (i+1, j-1), kým sa ukazovatele i a j navzájom neprekrížia alebo kým sa znaky v ukazovateľoch nezhodnú. Keďže každý znak v reťazci porovnávame práve raz, časová zložitosť je O(n).

predobjednávkový prechod stromu

Priestorová zložitosť: Priestorová zložitosť kódu je O(n), kde n je dĺžka vstupného reťazca. Je to preto, že každé rekurzívne volanie vytvára nový zásobníkový rámec, v ktorom sú uložené aktuálne hodnoty parametrov funkcie a lokálnych premenných. V najhoršom prípade môže zásobník volaní funkcie narásť až na n/2 (keď je vstupným reťazcom palindróm), takže priestorová zložitosť je O(n).

4. Použitie StringBuilder Approach v jazyku Java

Pri tomto prístupe

  • Najprv prevezmeme vstup String od používateľa.
  • Potom vytvoríme objekt Stringbuilder str1″ a uložíme doň hodnotu String.
  • Metóda reverse() v Stringbuider nám dáva reverzný reťazec. Ee uložte tento reverzný reťazec v str1.
  • Pomocou metódy equals() porovnávame hodnoty reťazca, pomocou kontroly podmienky if a else sú hodnoty reťazca podobné alebo nie.

Nižšie je uvedená implementácia vyššie uvedeného prístupu:

Java
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ýkon
Not a palindrome String>

Zložitosť vyššie uvedeného kódu:

Časová zložitosť: Časová zložitosť kódu je O(n), kde n je opäť dĺžka vstupného reťazca str. Primárnym faktorom, ktorý prispieva k tejto časovej zložitosti, je obrátenie reťazca pomocou str1.reverse(). Obrátenie reťazca týmto spôsobom má časovú zložitosť O(n), kde n je dĺžka reťazca. Ostatné operácie v kóde, ako je čítanie vstupu a porovnávanie reťazcov, sú operácie s konštantným časom a nemajú významný vplyv na celkovú časovú zložitosť.

avl rotácia stromu

Priestorová zložitosť: Priestorová zložitosť daného Java kódu je O(n), kde n je dĺžka vstupného reťazca str. Je to preto, že kód používa StringBuilder na uloženie obrátenej kópie vstupného reťazca a priestor potrebný pre StringBuilder je úmerný dĺžke vstupného reťazca.

Odkaz

Ak sa chcete dozvedieť viac o Palindróme, pozrite si Program strunového palindrómu .