Java-program til at kontrollere, om en streng er en palindrom

En streng siges at være et palindrom, hvis det er det samme, hvis vi begynder at læse det fra venstre mod højre eller højre mod venstre. I denne artikel lærer vi, hvordan man kontrollerer, om en streng er et palindrom i Java.

Så lad os overveje en streng str , nu er opgaven bare at finde ud af med sin omvendte streng er den samme som den er.

Eksempel på palindrom:

Input: str = abba
Produktion: Ja

Input: str = nørder
Produktion: Ingen

Metoder til palindromstreng i Java

Der er tre hovedmetoder til at kontrollere strengpalindrom i Java som nævnt nedenfor:

  1. Naiv metode
  2. To pointer metode
  3. Rekursiv metode
  4. Brug af StringBuilder

1. Naiv tilgang til at tjekke palindromstreng i Java

Ved at vende den givne streng og sammenligne. Vi kan kontrollere, om den givne streng er et palindrom, ved at sammenligne den originale streng med dens omvendte version.

Nedenfor er implementeringen af ​​ovenstående tilgang:

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); } // Kontrollerer om begge strengene er ens hvis (str.equals(rev)) { ans = true; } return ans; } public static void main(String[] args) { // Input string String str = 'geeks'; // Konverter strengen til små bogstaver str = str.toLowerCase(); boolsk A = er Palindrom(str); System.out.println(A); } } 

Produktion
false 

Kompleksiteten af ​​ovenstående metode:

Tidskompleksitet: Tidskompleksiteten af ​​den givne kode er O(n), hvor n er længden af ​​inputstrengen. Dette skyldes, at for-løkken gentager hvert tegn i strengen én gang for at skabe den omvendte streng.

Rumkompleksitet: Kodens rumkompleksitet er O(n), hvor n er længden af ​​inputstrengen. Dette skyldes, at den omvendte streng oprettes og lagres i en separat strengvariabel, som optager plads i hukommelsen proportionalt med længden af ​​inputstrengen. Derudover optager de andre variabler, der bruges i koden (i, str og ans) en konstant mængde plads, der er uafhængig af inputstørrelsen.

I ovenstående eksempel, hvis vi skriver ABba i stedet for abba , så skulle vi også få output som Ja . Så vi skal ændre strengens store og små bogstaver til enten små eller store bogstaver, før vi tjekker den for et palindrom. Hvis vi ikke gør dette, får vi uventede resultater. Dette skyldes, at compileren tjekker karaktererne ud fra deres ASCII værdi og ASCII Værdi af EN er ikke det samme som -en .

2. To pointer tilgang til P alindrome-program i Java

Vores tilgang vil være, at vi først vil konvertere strengen til små bogstaver. Så vil vi tage to pointer jeg peger på starten af ​​strengen og j peger mod enden af ​​strengen. Fortsæt med at stige jeg og faldende j mens jeg og ved hvert trin skal du kontrollere, om tegnene ved disse pointer er de samme eller ej. Hvis ikke, så er strengen ikke et palindrom ellers er det det.

Eksempel 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'); } } 

Produktion
No 

Kompleksiteten af ​​ovenstående metode:

Tidskompleksitet: Tidskompleksiteten af ​​den givne kode er O(n), hvor n er længden af ​​inputstrengen. Dette skyldes, at while-løkken itererer gennem halvdelen af ​​strengen for at kontrollere, om det er et palindrom. Da vi kun tjekker halvdelen af ​​strengen, er antallet af iterationer proportionalt med n/2, som er O(n).

Rumkompleksitet: Kodens pladskompleksitet er O(1), fordi koden kun bruger en konstant mængde ekstra plads, der er uafhængig af inputstørrelsen. De eneste variabler, der bruges i koden, er i, j og str, som hver optager en konstant mængde plads. Der oprettes ikke yderligere plads i koden.

Eksempel 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'); } } 

Produktion
String 1 :It is not a palindrome String 2 :It is a palindrome 

Kompleksiteten af ​​ovenstående metode:

Tidskompleksitet: Tidskompleksiteten af ​​den givne kode er O(n), hvor n er længden af ​​inputstrengen. Dette skyldes, at while-løkken i `isPalindrome`-metoden itererer gennem halvdelen af ​​strengen for at kontrollere, om det er et palindrom. Da vi kun tjekker halvdelen af ​​strengen, er antallet af iterationer proportionalt med n/2, som er O(n).

Rumkompleksitet: Kodens pladskompleksitet er O(1), fordi koden kun bruger en konstant mængde ekstra plads, der er uafhængig af inputstørrelsen. De eneste variabler, der bruges i koden, er i, j, str og str2, som hver optager en konstant mængde plads. Der oprettes ikke yderligere plads i koden.

3. Rekursiv tilgang til P alindrome-program i Java

Fremgangsmåden er meget enkel. Ligesom to-pointer tilgangen, vil vi kontrollere den første og den sidste værdi af strengen, men denne gang vil det være gennem rekursion.

  • Vi vil tage to pointere i, der peger på begyndelsen af ​​strengen og j, der peger mod slutningen af ​​strengen.
  • Fortsæt med at øge i og dekrementere j, mens i
  • Kontroller, om tegnene ved disse pointer er de samme eller ej. Vi gør dette gennem rekursion – (i+1, j-1
  • Hvis alle tegnene er ens på ith og jth indekset, indtil i>=j betingelsen opfylder, udskriv true else false.

Nedenfor er implementeringen af ​​ovenstående tilgang:

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; } // sammenligner tegnene på disse pointere if (A.charAt(i) != A.charAt(j)) { return false; } // kontrollerer alt igen rekursivt returnerer isPalindrome(i + 1, j - 1, A); } public static boolean isPalindrome(String A) { return isPalindrome(0, A.length() - 1, A); } // hovedfunktion public static void main(String[] args) { // Input string String A = 'geeks'; // Konverter strengen til små bogstaver A = A.toLowerCase(); boolsk str = isPalindrom(A); System.out.println(str); } } 

Produktion
false 

Kompleksiteten af ​​ovenstående metode:

Tidskompleksitet: Tidskompleksiteten af ​​den givne kode er O(n), hvor n er længden af ​​inputstrengen. Dette skyldes, at `isPalindrome`-funktionen rekursivt kalder sig selv for tegnene på positionerne (i+1, j-1), indtil pointerne i og j krydser hinanden, eller tegnene ved pointerne ikke er ens. Da vi sammenligner hvert tegn i strengen nøjagtigt én gang, er tidskompleksiteten O(n).

Rumkompleksitet: Kodens rumkompleksitet er O(n), hvor n er længden af ​​inputstrengen. Dette skyldes, at hvert rekursivt kald opretter en ny stakramme, der gemmer de aktuelle værdier af funktionsparametrene og lokale variabler. I værste fald kan funktionskaldsstakken vokse så stor som n/2 (når inputstrengen er et palindrom), så rumkompleksiteten er O(n).

4. Brug af StringBuilder Approach i Java

I denne tilgang

  • Først tager vi String-inputtet fra brugeren.
  • Derefter opretter vi Stringbuilder-objektet str1″og gemmer værdien af ​​String i det.
  • Reverse()-metoden i Stringbuider giver os den omvendte streng. Ee gemme den omvendte streng i str1.
  • Ved hjælp af equals()-metoden sammenligner vi strengens værdier, ved hjælp af if og else condition check, at strengværdien er ens eller ej.

Nedenfor er implementeringen af ​​ovenstående tilgang:

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'); } } } 

Produktion
Not a palindrome String 

Kompleksiteten af ​​ovenstående kode:

Tidskompleksitet: Kodens tidskompleksitet er O(n), hvor n igen er længden af ​​inputstrengen str. Den primære faktor, der bidrager til denne tidskompleksitet, er vendingen af ​​strengen ved hjælp af str1.reverse(). At vende en streng på denne måde har en tidskompleksitet på O(n), hvor n er længden af ​​strengen. Andre operationer i koden, såsom læsning af input og sammenligning af strenge, er konstant-tidsoperationer og påvirker ikke den samlede tidskompleksitet væsentligt.

Rumkompleksitet: Rumkompleksiteten af ​​den givne Java-kode er O(n), hvor n er længden af ​​inputstrengen str. Dette skyldes, at koden bruger en StringBuilder til at gemme en omvendt kopi af inputstrengen, og den nødvendige plads til StringBuilder er proportional med længden af ​​inputstrengen.

Reference

For at vide mere om Palindrom henvises til Program for strengpalindrom .