ตรวจสอบสตริงสำหรับ palindrome


94

palindromeเป็นคำวลีจำนวนหรือลำดับอื่น ๆ ของหน่วยงานที่สามารถอ่านได้ในลักษณะเดียวกันในทิศทางใดทิศทางหนึ่ง

ในการตรวจสอบว่าคำนั้นเป็นพาลินโดรมหรือไม่ฉันได้รับอาร์เรย์ของคำและเปรียบเทียบตัวอักษร ฉันทดสอบแล้วและดูเหมือนว่าจะได้ผล อย่างไรก็ตามฉันต้องการทราบว่าถูกต้องหรือมีสิ่งที่ต้องปรับปรุง

นี่คือรหัสของฉัน:

public class Aufg1 {
    public static void main(String[] args) {
        String wort = "reliefpfpfeiller";
        char[] warray = wort.toCharArray(); 
        System.out.println(istPalindrom(warray));       
    }

    public static boolean istPalindrom(char[] wort){
        boolean palindrom = false;
        if(wort.length%2 == 0){
            for(int i = 0; i < wort.length/2-1; i++){
                if(wort[i] != wort[wort.length-i-1]){
                    return false;
                }else{
                    palindrom = true;
                }
            }
        }else{
            for(int i = 0; i < (wort.length-1)/2-1; i++){
                if(wort[i] != wort[wort.length-i-1]){
                    return false;
                }else{
                    palindrom = true;
                }
            }
        }
        return palindrom;
    }
}

4
ไม่แน่ใจว่านี่เป็นความตั้งใจ แต่สตริงในตัวอย่างของคุณ - reliefpfpfeiller - ไม่ใช่ palindrome
barrowc

คำตอบ:


185

ทำไมไม่เพียง:

public static boolean istPalindrom(char[] word){
    int i1 = 0;
    int i2 = word.length - 1;
    while (i2 > i1) {
        if (word[i1] != word[i2]) {
            return false;
        }
        ++i1;
        --i2;
    }
    return true;
}

ตัวอย่าง:

อินพุตคือ "andna"
i1 จะเป็น 0 และ i2 จะเป็น 4

ย้ำห่วงครั้งแรกที่เราจะเปรียบเทียบและword[0] word[4]มันเท่ากันเราจึงเพิ่ม i1 (ตอนนี้เป็น 1) และลด i2 (ตอนนี้เป็น 3)
เราจึงเปรียบเทียบ n มันเท่ากันดังนั้นเราจึงเพิ่ม i1 (ตอนนี้เป็น 2) และลด i2 (มันคือ 2)
ตอนนี้ i1 และ i2 มีค่าเท่ากัน (ทั้งคู่เป็น 2) ดังนั้นเงื่อนไขของลูป while จึงไม่เป็นจริงอีกต่อไปดังนั้นการวนซ้ำจึงสิ้นสุดลงและเราคืนค่าจริง


1
แทนการเพิ่มก่อน (++ i1 และ --i2) เรายังสามารถใช้ผลลัพธ์การเพิ่มโพสต์ (i1 ++, i2 -) ได้เช่นเดียวกันฉันคิดว่า!
user0946076422

@ user0946076422 ครับ ฉันเองก็รู้สึกเช่นนั้นเช่นกัน จะดีมากถ้า OP มีคำอธิบายที่แตกต่างออกไป
Vijay Tholpadi

3
@Vijay Tholpadi - มันเป็นเพียงความชอบในการเข้ารหัสมากกว่าสิ่งอื่นใด การเพิ่มโพสต์จะทำให้ได้ผลลัพธ์เดียวกันในตัวอย่างนี้ แต่ฉันมักจะใช้การเพิ่มก่อนเสมอเว้นแต่จะมีเหตุผลเฉพาะที่จะไม่ทำ
dcp

118

คุณสามารถตรวจสอบว่าสตริงเป็นพาลินโดรมหรือไม่โดยการเปรียบเทียบกับสิ่งที่ตรงกันข้าม:

public static boolean isPalindrome(String str) {
    return str.equals(new StringBuilder(str).reverse().toString());
}

หรือสำหรับ Java เวอร์ชันก่อนหน้า 1.5

public static boolean isPalindrome(String str) {
    return str.equals(new StringBuffer().append(str).reverse().toString());
}

แก้ไข: @FernandoPelliccioni ให้การวิเคราะห์อย่างละเอียดเกี่ยวกับประสิทธิภาพ (หรือขาด) ของโซลูชันนี้ทั้งในแง่ของเวลาและพื้นที่ หากคุณสนใจในความซับซ้อนในการคำนวณของสิ่งนี้และวิธีแก้ปัญหาอื่น ๆ ที่เป็นไปได้สำหรับคำถามนี้โปรดอ่าน!


10
เปรียบเทียบความซับซ้อนของอัลกอริทึมของคุณกับผู้อื่น
Fernando Pelliccioni

2
@FernandoPelliccioni ฉันคิดว่ามันซับซ้อนเหมือนกันกับวิธีแก้ปัญหาอื่น ๆ ไม่ใช่เหรอ?
aioobe

1
@ เฟอร์นันโดเท่าที่ฉันสามารถบอกได้ว่าคำตอบทั้งหมดมีความซับซ้อนเชิงเส้น ด้วยเหตุนี้จึงไม่มีวิธีใดที่จะให้คำตอบที่ชัดเจนว่าโซลูชันใดมีประสิทธิภาพสูงสุด คุณสามารถเรียกใช้การวัดประสิทธิภาพได้ แต่จะเฉพาะเจาะจงสำหรับ JVM และ JRE โดยเฉพาะ ขอให้โชคดีกับบล็อกโพสต์ของคุณ รอคอยที่จะอ่านมัน
aioobe

1
@FernandoPelliccioni มันเป็นสำนวนสำหรับคนที่ฉลาดฉลาดสามารถหาทางแก้ไขสถานการณ์ที่ยากลำบาก :-)
Sipty

1
@FernandoPelliccioni การวิเคราะห์ที่ดี
Saravana

66

เวอร์ชันที่กระชับซึ่งไม่เกี่ยวข้องกับการเริ่มต้นกลุ่มวัตถุ (ไม่มีประสิทธิภาพ):

boolean isPalindrome(String str) {    
    int n = str.length();
    for( int i = 0; i < n/2; i++ )
        if (str.charAt(i) != str.charAt(n-i-1)) return false;
    return true;    
}

18

อีกวิธีหนึ่งคือการเรียกซ้ำ

สำหรับใครก็ตามที่กำลังมองหาวิธีแก้ปัญหาแบบวนซ้ำที่สั้นกว่าเพื่อตรวจสอบว่าสายอักขระที่กำหนดนั้นตรงตามรูปแบบพาลินโดรมหรือไม่:

private boolean isPalindrome(String s) {
    int length = s.length();

    if (length < 2) // If the string only has 1 char or is empty
        return true;
    else {
        // Check opposite ends of the string for equality
        if (s.charAt(0) != s.charAt(length - 1))
            return false;
        // Function call for string with the two ends snipped off
        else
            return isPalindrome(s.substring(1, length - 1));
    }
}

หรือแม้กระทั่งสั้นถ้าคุณต้องการ:

private boolean isPalindrome(String s) {
    int length = s.length();
    if (length < 2) return true;
    return s.charAt(0) != s.charAt(length - 1) ? false :
            isPalindrome(s.substring(1, length - 1));
}

3
โค้ดที่ดีการเรียกซ้ำทำให้ง่ายและมีบรรทัดในโค้ดน้อยลง
Akash5288

2
เวอร์ชันที่สั้นกว่าสามารถทำให้ง่ายขึ้น:return s.charAt(0) == s.charAt(l - 1) && isPalindrome(s.substring(1, l - 1));
vault

10

ไป Java:

public boolean isPalindrome (String word) {
    String myWord = word.replaceAll("\\s+","");
    String reverse = new StringBuffer(myWord).reverse().toString();
    return reverse.equalsIgnoreCase(myWord);
}

isPalindrome("Never Odd or Even"); // True
isPalindrome("Never Odd or Even1"); // False

สิ่งเหล่านี้เป็นวิธีแก้ปัญหาที่ง่ายและตรงไปตรงมาที่สุดสำหรับฉัน ขอบคุณ!
RShome

4

ยังเป็นวิธีการแก้ปัญหาที่แตกต่างกัน:

public static boolean isPalindrome(String s) {

        for (int i=0 , j=s.length()-1 ; i<j ; i++ , j-- ) {

            if ( s.charAt(i) != s.charAt(j) ) {
                return false;
            }
        }

        return true;
    }

4

และนี่คือโซลูชันสตรีมมิ่ง Java 8 ที่สมบูรณ์ IntStreamให้ดัชนีทั้งหมด til สายยาวครึ่งหนึ่งแล้วเปรียบเทียบจากการเริ่มต้นและจากจุดสิ้นสุดจะทำ

public static void main(String[] args) {
    for (String testStr : Arrays.asList("testset", "none", "andna", "haah", "habh", "haaah")) {
        System.out.println("testing " + testStr + " is palindrome=" + isPalindrome(testStr));
    }
}

public static boolean isPalindrome(String str) {
    return IntStream.range(0, str.length() / 2)
            .noneMatch(i -> str.charAt(i) != str.charAt(str.length() - i - 1));
}

ผลลัพธ์คือ:

testing testset is palindrome=true
testing none is palindrome=false
testing andna is palindrome=true
testing haah is palindrome=true
testing habh is palindrome=false
testing haaah is palindrome=true

1
ทำไมไม่ทำallMatchด้วยallMatch(i -> str.charAt(i) == str.charAt(str.length() - i - 1))?
gil.fernandes

4
public class Palindromes {
    public static void main(String[] args) {
         String word = "reliefpfpfeiller";
         char[] warray = word.toCharArray(); 
         System.out.println(isPalindrome(warray));       
    }

    public static boolean isPalindrome(char[] word){
        if(word.length%2 == 0){
            for(int i = 0; i < word.length/2-1; i++){
                if(word[i] != word[word.length-i-1]){
                    return false;
                }
            }
        }else{
            for(int i = 0; i < (word.length-1)/2-1; i++){
                if(word[i] != word[word.length-i-1]){
                    return false;
                }
            }
        }
        return true;
    }
}

2
ทำให้ง่ายขึ้นเล็กน้อย แต่ฉันชอบคำตอบของ dcp!
Casey

คุณเคยลองวิ่งisPalindrome()ด้วย"cbb"หรือไม่?
kenshinji

3
public class palindrome {
public static void main(String[] args) {
    StringBuffer strBuf1 = new StringBuffer("malayalam");
    StringBuffer strBuf2 = new StringBuffer("malayalam");
    strBuf2.reverse();


    System.out.println(strBuf2);
    System.out.println((strBuf1.toString()).equals(strBuf2.toString()));
    if ((strBuf1.toString()).equals(strBuf2.toString()))
        System.out.println("palindrome");
    else
        System.out.println("not a palindrome");
}

}


3

ฉันหาวิธีแก้ปัญหาสำหรับคำถามที่ทำเครื่องหมายว่าซ้ำกับคำถามนี้ อาจจะโยนมันไว้ที่นี่ก็ได้ ...

คำถามขอบรรทัดเดียวในการแก้ปัญหานี้และฉันใช้มันมากขึ้นในฐานะแท่นวางวรรณกรรมดังนั้นช่องว่างเครื่องหมายวรรคตอนและตัวพิมพ์ใหญ่ / เล็กสามารถทำให้ผลลัพธ์ออกไปได้

นี่คือวิธีแก้ปัญหาที่น่าเกลียดด้วยคลาสทดสอบขนาดเล็ก:

public class Palindrome {
   public static boolean isPalendrome(String arg) {
         return arg.replaceAll("[^A-Za-z]", "").equalsIgnoreCase(new StringBuilder(arg).reverse().toString().replaceAll("[^A-Za-z]", ""));
   }
   public static void main(String[] args) {
      System.out.println(isPalendrome("hiya"));
      System.out.println(isPalendrome("star buttons not tub rats"));
      System.out.println(isPalendrome("stab nail at ill Italian bats!"));
      return;
   }
}

ขออภัยที่เป็นเรื่องที่น่ารังเกียจ - แต่คำถามอื่น ๆ ระบุว่าเป็นหนึ่งซับ


1
แค่อยากรู้ว่าทำไมตัวดำเนินการ ternary ในตอนท้าย?
typeduck

ไม่มีอะไรแน่นอน - ฉันต้องไม่ดื่มกาแฟ จะแก้ไขคำตอบของฉัน - ขอบคุณ!.
Marc

3

การตรวจสอบ palindrome สำหรับครึ่งแรกของสตริงด้วยส่วนที่เหลือกรณีนี้จะถือว่าการลบช่องว่างสีขาวออก

public int isPalindrome(String a) {
        //Remove all spaces and non alpha characters
        String ab = a.replaceAll("[^A-Za-z0-9]", "").toLowerCase();
        //System.out.println(ab);

        for (int i=0; i<ab.length()/2; i++) {
            if(ab.charAt(i) != ab.charAt((ab.length()-1)-i)) {
                return 0;
            }
        }   
        return 1;
    }

2

ฉันยังใหม่กับ java และฉันกำลังตั้งคำถามของคุณเป็นความท้าทายในการพัฒนาความรู้

import java.util.ArrayList;
import java.util.List;

public class PalindromeRecursiveBoolean {

    public static boolean isPalindrome(String str) {

        str = str.toUpperCase();
        char[] strChars = str.toCharArray();

        List<Character> word = new ArrayList<>();
        for (char c : strChars) {
            word.add(c);
        }

        while (true) {
            if ((word.size() == 1) || (word.size() == 0)) {
                return true;
            }
            if (word.get(0) == word.get(word.size() - 1)) {
                word.remove(0);
                word.remove(word.size() - 1);
            } else {
                return false;

            }

        }
    }
}
  1. หากสตริงไม่ได้สร้างขึ้นจากตัวอักษรหรือเพียงตัวเดียวแสดงว่าเป็นพาลินโดรม
  2. มิฉะนั้นให้เปรียบเทียบตัวอักษรตัวแรกและตัวสุดท้ายของสตริง
    • หากตัวอักษรตัวแรกและตัวสุดท้ายแตกต่างกันแสดงว่าสตริงนั้นไม่ใช่พาลินโดรม
    • มิฉะนั้นตัวอักษรตัวแรกและตัวสุดท้ายจะเหมือนกัน ดึงออกจากสตริงและพิจารณาว่าสตริงที่ยังคงอยู่นั้นเป็นพาลินโดรมหรือไม่ ใช้คำตอบสำหรับสตริงที่มีขนาดเล็กนี้และใช้มันเป็นคำตอบสำหรับสตริงเดิมแล้วทำซ้ำจาก1

1

ลองสิ่งนี้:

import java.util.*;
    public class str {

        public static void main(String args[])
        {
          Scanner in=new Scanner(System.in);
          System.out.println("ENTER YOUR STRING: ");
          String a=in.nextLine();
          System.out.println("GIVEN STRING IS: "+a);
          StringBuffer str=new StringBuffer(a);
          StringBuffer str2=new StringBuffer(str.reverse());
          String s2=new String(str2);
          System.out.println("THE REVERSED STRING IS: "+str2);
            if(a.equals(s2))    
                System.out.println("ITS A PALINDROME");
            else
                System.out.println("ITS NOT A PALINDROME");
            }
    }

1
public boolean isPalindrome(String abc){
    if(abc != null && abc.length() > 0){
        char[] arr = abc.toCharArray();
        for (int i = 0; i < arr.length/2; i++) {
            if(arr[i] != arr[arr.length - 1 - i]){
                return false;
            }
        }
        return true;
    }
    return false;
}

1

อีกวิธีหนึ่งคือการใช้ถ่านอาร์เรย์

public class Palindrome {

public static void main(String[] args) {
    String str = "madam";
    if(isPalindrome(str)) {
        System.out.println("Palindrome");
    } else {
        System.out.println("Not a Palindrome");
    }
}

private static boolean isPalindrome(String str) {
    // Convert String to char array
    char[] charArray = str.toCharArray();  
    for(int i=0; i < str.length(); i++) {
        if(charArray[i] != charArray[(str.length()-1) - i]) {
            return false;
        }
    }
    return true;
}

}


1
แนวทางนี้ดีเยี่ยม Time Complexity O (n), space Complexity O (1)
kanaparthikiran

1

นี่คือการวิเคราะห์คำตอบ @Greg ของฉัน: componentsprogramming.com/palindromes


Sidenote:แต่สำหรับฉันมันเป็นสิ่งสำคัญที่จะทำมันในทางทั่วไป ข้อกำหนดคือลำดับสามารถทำซ้ำได้แบบสองทิศทางและองค์ประกอบของลำดับจะเปรียบเทียบได้โดยใช้ความเท่าเทียมกัน ฉันไม่รู้วิธีทำใน Java แต่นี่เป็นเวอร์ชัน C ++ ฉันไม่รู้วิธีที่ดีกว่าในการทำลำดับแบบสองทิศทาง

template <BidirectionalIterator I> 
    requires( EqualityComparable< ValueType<I> > ) 
bool palindrome( I first, I last ) 
{ 
    I m = middle(first, last); 
    auto rfirst = boost::make_reverse_iterator(last); 
    return std::equal(first, m, rfirst); 
} 

ความซับซ้อน: เวลาเชิงเส้น

  • ถ้าฉันเป็น RandomAccessIterator: floor (n / 2) comparissons และ floor (n / 2) * 2 ซ้ำ

  • ถ้าฉันเป็น BidirectionalIterator: floor (n / 2) comparissons และ floor (n / 2) * 2 ซ้ำบวก (3/2) * n ซ้ำเพื่อค้นหากลาง (ฟังก์ชันกลาง)

  • การจัดเก็บ: O (1)

  • ไม่มีหน่วยความจำที่จัดสรร dymamic



1

เมื่อเร็ว ๆ นี้ฉันเขียนโปรแกรม palindrome ซึ่งไม่ได้ใช้ StringBuilder คำตอบที่ล่าช้า แต่อาจมีประโยชน์สำหรับบางคน

public boolean isPalindrome(String value) {
    boolean isPalindrome = true;
    for (int i = 0 , j = value.length() - 1 ; i < j ; i ++ , j --) {
        if (value.charAt(i) != value.charAt(j)) {
            isPalindrome = false;
        }
    }
    return isPalindrome;
}

1

ใช้ stack ก็ทำได้แบบนี้

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
import java.util.*;

public class Solution {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str=in.nextLine();
        str.replaceAll("\\s+","");
        //System.out.println(str);
        Stack<String> stack=new Stack<String>();
        stack.push(str);
        String str_rev=stack.pop();
        if(str.equals(str_rev)){
            System.out.println("Palindrome"); 
        }else{
             System.out.println("Not Palindrome");
        }
    }
}

ดังที่คุณต้องทราบว่าสแต็กเป็นประเภท LIFO ซึ่งหมายความว่าคุณกำลังผลักดันข้อมูลผ่านจุดเริ่มต้นของสแต็กและดึงข้อมูลจากจุดสิ้นสุดของสแต็กโดยใช้ป๊อป () หวังว่านี่จะช่วยได้!
aayushi


1

น่าทึ่งมากที่มีวิธีแก้ปัญหาง่ายๆแบบนี้! นี่คืออีกอัน

private static boolean palindrome(String s){
    String revS = "";
    String checkS = s.toLowerCase();
    String[] checkSArr = checkS.split("");

    for(String e : checkSArr){
        revS = e + revS;
    }

    return (checkS.equals(revS)) ? true : false;
}

1
  • การใช้งานนี้ใช้ได้กับตัวเลขและสตริง
  • เนื่องจากเราไม่ได้เขียนอะไรเลยจึงไม่จำเป็นต้องแปลงสตริงเป็นอาร์เรย์อักขระ
public static boolean isPalindrome(Object obj)
{
    String s = String.valueOf(obj);

    for(int left=0, right=s.length()-1; left < right; left++,right--)
    {
        if(s.charAt(left++) != s.charAt(right--))
            return false;
    }
    return true;
}

1

ทำไมไม่เพียง:

boolean isPalindrom(String s) {
        char[] myChars = s.toCharArray();
        for (int i = 0; i < myChars.length/2; i++) {
            if (myChars[i] != myChars[myChars.length - 1 - i]) {
                return false;
            }
        }
        return true;
}

0
import java.util.Scanner;


public class Palindrom {

    public static void main(String []args)
    {
        Scanner in = new Scanner(System.in);
        String str= in.nextLine();
        int x= str.length();

        if(x%2!=0)
        {
            for(int i=0;i<x/2;i++)
            {

                if(str.charAt(i)==str.charAt(x-1-i))
                {
                    continue;
                }
                else 
                {
                    System.out.println("String is not a palindrom");
                    break;
                }
            }
        }
        else
        {
            for(int i=0;i<=x/2;i++)
            {
                if(str.charAt(i)==str.charAt(x-1-i))
                {
                    continue;
                }
                else 
                {
                    System.out.println("String is not a palindrom");
                    break;
                }

            }
        }
    }

}

0
private static boolean isPalindrome(String word) {

        int z = word.length();
        boolean isPalindrome = false;

        for (int i = 0; i <= word.length() / 2; i++) {
            if (word.charAt(i) == word.charAt(--z)) {
                isPalindrome = true;
            }
        }

        return isPalindrome;
    }

0

ฉันกำลังมองหาวิธีแก้ปัญหาที่ไม่เพียง แต่ใช้ได้ผลกับ palindromes เช่น ...

  • "เรือคายัค"
  • “ ท่านผู้หญิง”

... แต่สำหรับ ...

  • "ชายแผนคลองปานามา!"
  • "มันเป็นรถหรือแมวที่ฉันเห็น"
  • "ไม่มี 'x' ในนิกสัน"

การทำซ้ำ : สิ่งนี้ได้รับการพิสูจน์แล้วว่าเป็นทางออกที่ดี

private boolean isPalindromeIterative(final String string)
    {
        final char[] characters =
            string.replaceAll("[\\W]", "").toLowerCase().toCharArray();

        int iteratorLeft = 0;
        int iteratorEnd = characters.length - 1;

        while (iteratorEnd > iteratorLeft)
        {
            if (characters[iteratorLeft++] != characters[iteratorEnd--])
            {
                return false;
            }
        }

        return true;
    }

ซ้ำ ฉันคิดว่าการแก้ปัญหานี้ไม่ควรแย่ไปกว่าการทำซ้ำ เป็นเรื่องเล็กน้อยที่เราต้องดึงขั้นตอนการทำความสะอาดออกจากวิธีการเพื่อหลีกเลี่ยงการดำเนินการที่ไม่เหมาะสม

private boolean isPalindromeRecursive(final String string)
        {
            final String cleanString = string.replaceAll("[\\W]", "").toLowerCase();
            return isPalindromeRecursiveRecursion(cleanString);
        }

private boolean isPalindromeRecursiveRecursion(final String cleanString)
        {
            final int cleanStringLength = cleanString.length();

            return cleanStringLength <= 1 || cleanString.charAt(0) ==
                       cleanString.charAt(cleanStringLength - 1) &&
                       isPalindromeRecursiveRecursion  
                           (cleanString.substring(1, cleanStringLength - 1));
        }

การย้อนกลับ : สิ่งนี้ได้รับการพิสูจน์แล้วว่าเป็นโซลูชันที่มีราคาแพง

private boolean isPalindromeReversing(final String string)
    {
        final String cleanString = string.replaceAll("[\\W]", "").toLowerCase();
        return cleanString.equals(new StringBuilder(cleanString).reverse().toString());
    }

เครดิตทั้งหมดสำหรับคนที่ตอบในโพสต์นี้และนำความสว่างมาสู่หัวข้อ


0

ไม่พิจารณาตัวอักษรในคำ

public static boolean palindromeWords(String s ){

        int left=0;
        int right=s.length()-1;

        while(left<=right){

            while(left<right && !Character.isLetter(s.charAt(left))){
                left++;
            }
            while(right>0 && !Character.isLetter(s.charAt(right))){
                right--;
            }

            if((s.charAt(left++))!=(s.charAt(right--))){
                return false;
            }
        }
        return true;
    }

———

@Test
public void testPalindromeWords(){
    assertTrue(StringExercise.palindromeWords("ece"));
    assertTrue(StringExercise.palindromeWords("kavak"));
    assertFalse(StringExercise.palindromeWords("kavakdf"));
    assertTrue(StringExercise.palindromeWords("akka"));
    assertTrue(StringExercise.palindromeWords("??e@@c_--e"));
}

0

ที่นี่คุณสามารถตรวจสอบ Palindrome จำนวน String แบบไดนามิกได้

import java.util.Scanner;

public class Checkpalindrome {
 public static void main(String args[]) {
  String original, reverse = "";
  Scanner in = new Scanner(System.in);
  System.out.println("Enter How Many number of Input you want : ");
  int numOfInt = in.nextInt();
  original = in.nextLine();
do {
  if (numOfInt == 0) {
    System.out.println("Your Input Conplete");
   } 
  else {
    System.out.println("Enter a string to check palindrome");
    original = in.nextLine();

    StringBuffer buffer = new StringBuffer(original);
    reverse = buffer.reverse().toString();

  if (original.equalsIgnoreCase(reverse)) {
    System.out.println("The entered string is Palindrome:"+reverse);
   } 
  else {
    System.out.println("The entered string is not Palindrome:"+reverse);
    }
 }
   numOfInt--;
    } while (numOfInt >= 0);
}
}

0

IMO วิธีเรียกซ้ำเป็นวิธีที่ง่ายและชัดเจนที่สุด

public static boolean isPal(String s)
{   
    if(s.length() == 0 || s.length() == 1)
        return true; 
    if(s.charAt(0) == s.charAt(s.length()-1))
       return isPal(s.substring(1, s.length()-1));                
   return false;
}

2
สิ่งนี้ถูกใช้ในคำตอบแล้ว: ตรวจสอบสตริงสำหรับ palindrome (แค่หมายเหตุ)
Tom

ขออภัยฉันพลาดไป
john Smith

0

ที่นี่การตรวจสอบพาลินโดรมที่ใหญ่ที่สุดในสตริงโดยเริ่มจากอักขระที่ 1 เสมอ

public static String largestPalindromeInString(String in) {
    int right = in.length() - 1;
    int left = 0;
    char[] word = in.toCharArray();
    while (right > left && word[right] != word[left]) {
        right--;
    }
    int lenght = right + 1;
    while (right > left && word[right] == word[left]) {

        left++;
        right--;

    }
    if (0 >= right - left) {
        return new String(Arrays.copyOf(word, lenght ));
    } else {
        return largestPalindromeInString(
                new String(Arrays.copyOf(word, in.length() - 1)));
    }
}

0

ข้อมูลโค้ด:

import java.util.Scanner;

 class main
 {
    public static void main(String []args)
    {
       Scanner sc = new Scanner(System.in);
       String str = sc.next();
       String reverse = new StringBuffer(str).reverse().toString();

        if(str.equals(reverse))
            System.out.println("Pallindrome");
        else
            System.out.println("Not Pallindrome");
     }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.