2011-12-09 26 views
11

Tôi muốn kiểm tra xem chuỗi có phải là một palindrome hay không. Tôi muốn tìm hiểu một phương pháp dễ dàng để kiểm tra tương tự sử dụng ít nhất là chuỗi các thao tác có thểCách Java để kiểm tra xem chuỗi có phải là palindrome

+1

http://stackoverflow.com/questions/248161/palindrome -detection-efficiency – Andy

+1

@Andy: Đó là để phát hiện hiệu quả giống nhau. Tôi muốn mã theo cách đơn giản với ít nhất số dòng mã và phương pháp được sử dụng !! –

Trả lời

6

Bạn có thể thử một cái gì đó như thế này:

String variable = ""; #write a string name 

    StringBuffer rev = new StringBuffer(variable).reverse(); 

    String strRev = rev.toString(); 

    if(variable.equalsIgnoreCase(strRev)) # Check the condition 
+1

Bạn cũng có thể thay thế^[a-z] để điều này có thể làm việc với những người bạn thân như "Madam, tôi là Adam". –

+0

@ Alex K, nếu bạn không lo lắng về trường hợp nhạy cảm, thì câu của bạn là một palindrome. ;-) –

7

Dưới đây là một lớp học tốt:

public class Palindrome { 

    public static boolean isPalindrome(String stringToTest) { 
    String workingCopy = removeJunk(stringToTest); 
    String reversedCopy = reverse(workingCopy); 

    return reversedCopy.equalsIgnoreCase(workingCopy); 
    } 

    protected static String removeJunk(String string) { 
    int i, len = string.length(); 
    StringBuffer dest = new StringBuffer(len); 
    char c; 

    for (i = (len - 1); i >= 0; i--) { 
     c = string.charAt(i); 
     if (Character.isLetterOrDigit(c)) { 
     dest.append(c); 
     } 
    } 

    return dest.toString(); 
    } 

    protected static String reverse(String string) { 
    StringBuffer sb = new StringBuffer(string); 

    return sb.reverse().toString(); 
    } 

    public static void main(String[] args) { 
    String string = "Madam, I'm Adam."; 

    System.out.println(); 
    System.out.println("Testing whether the following " 
     + "string is a palindrome:"); 
    System.out.println(" " + string); 
    System.out.println(); 

    if (isPalindrome(string)) { 
     System.out.println("It IS a palindrome!"); 
    } else { 
     System.out.println("It is NOT a palindrome!"); 
    } 
    System.out.println(); 
    } 
} 

Thưởng thức.

+0

công khai boolean isPalindrone (Chuỗi checkPalindrome) { \t \t \t \t int length = checkPalindrome.length(); \t \t int mid = length/2; \t \t int i, j = 0; \t \t \t \t for (i = 0, j = chiều dài-1; i user358591

102

Sử dụng reverse là quá mức cần thiết vì bạn không cần tạo thêm chuỗi, bạn chỉ cần truy vấn chuỗi hiện có. Ví dụ sau đây kiểm tra các ký tự đầu tiên và cuối cùng là như nhau, và sau đó đi sâu hơn bên trong chuỗi kiểm tra kết quả mỗi lần. Nó trả về ngay sau khi s không phải là palindrome.

Sự cố với cách tiếp cận reverse là tất cả đều hoạt động ở phía trước. Nó thực hiện một hành động đắt tiền trên một chuỗi, sau đó kiểm tra ký tự theo ký tự cho đến khi các chuỗi không bằng nhau và chỉ sau đó trả về false nếu nó không phải là một palindrome. Nếu bạn chỉ là so sánh các chuỗi nhỏ tất cả các thời gian thì điều này là tốt, nhưng nếu bạn muốn bảo vệ mình chống lại đầu vào lớn hơn thì bạn nên xem xét thuật toán này.

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

    return true; 
} 
+5

Có lẽ là giải pháp nhanh nhất thực hiện. –

+2

Giải pháp cao cấp! – buruzaemon

+0

Có thể thay đổi giải pháp này để lấy ký tự làm đầu vào thay vì chuỗi không? Tôi đang tìm kiếm cùng một giải pháp palindrome nhưng với đầu vào ký tự. Tôi cũng có thể hỏi liệu vòng lặp For có thực sự kiểm tra từng ký tự từ một nửa chuỗi và so sánh chúng không? Cảm ơn –

22

Đối với các dòng mã ít nhất và trường hợp đơn giản

if(s.equals(new StringBuilder(s).reverse().toString())) // is a palindrome. 
0

kiểm tra tình trạng này

Chuỗi string = "// một số chuỗi ... //"

séc này ... if (string.equals ((string.reverse()) { nó là palindrome }

+0

' Chuỗi' không có phương thức 'đảo ngược'. –

2

Tôi đoán đây là cách đơn giản để kiểm tra palindrome

String strToRevrse = "MOM"; 

strToRevrse.equalsIgnoreCase(new StringBuilder(strToRevrse).reverse().toString()); 
0
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; 
} 
+1

Được sao chép từ đây http://stackoverflow.com/a/4138856/1740354. Đề cập đến nguồn sẽ là một ý tưởng tốt. –

0
import java.util.Scanner; 

public class FindAllPalindromes { 
static String longestPalindrome; 
public String oldPalindrome=""; 
static int longest; 

public void allSubstrings(String s){   
    for(int i=0;i<s.length();i++){ 
     for(int j=1;j<=s.length()-i;j++){ 
      String subString=s.substring(i, i+j); 
      palindrome(subString);    
     } 
    } 
     } 
public void palindrome(String sub){ 
    System.out.println("String to b checked is "+sub); 
    StringBuilder sb=new StringBuilder(); 
    sb.append(sub);  // append string to string builder 
    sb.reverse();   
    if(sub.equals(sb.toString())){      // palindrome condition 
     System.out.println("the given String :"+sub+" is a palindrome"); 
     longestPalindrome(sub); 
    } 
    else{ 
     System.out.println("the string "+sub+"iss not a palindrome"); 
    } 
     } 
public void longestPalindrome(String s){ 
      if(s.length()>longest){     
     longest=s.length(); 
     longestPalindrome=s; 

    } 
    else if (s.length()==longest){  
     oldPalindrome=longestPalindrome; 
     longestPalindrome=s; 

    } 




} 

public static void main(String[] args) { 
FindAllPalindromes fp=new FindAllPalindromes(); 

    Scanner sc=new Scanner(System.in);  
    System.out.println("Enter the String ::"); 
    String s=sc.nextLine(); 
    fp.allSubstrings(s);  
    sc.close(); 
    if(fp.oldPalindrome.length()>0){ 
    System.out.println(longestPalindrome+"and"+fp.oldPalindrome+":is the longest palindrome"); 
    } 
    else{ 
     System.out.println(longestPalindrome+":is the longest palindrome`````"); 
    }} 
} 
8

Dưới đây là một trong những đơn giản"

public class Palindrome { 

    public static void main(String [] args){ 
     Palindrome pn = new Palindrome(); 

     if(pn.isPalindrome("ABBA")){ 
      System.out.println("Palindrome"); 
     } else { 
      System.out.println("Not Palindrome"); 
     } 
    } 

    public boolean isPalindrome(String original){ 
     int i = original.length()-1; 
     int j=0; 
     while(i > j) { 
      if(original.charAt(i) != original.charAt(j)) { 
       return false; 
      } 
      i--; 
      j++; 
     } 
     return true; 
    } 
} 
1

Tôi mới đến java và tôi chiếm câu hỏi của bạn cũng là một thách thức để cải thiện kiến ​​thức của tôi, vì vậy hãy tha thứ cho tôi nếu điều này không trả lời tốt cho câu hỏi của bạn:

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. Nếu chuỗi được tạo thành không có chữ cái hoặc chỉ một chữ cái, nó là palindrome.
  2. Nếu không, hãy so sánh các chữ cái đầu tiên và cuối cùng của chuỗi.
    • Nếu chữ cái đầu và cuối cùng khác nhau, thì chuỗi không phải là palindrome
    • Nếu không, chữ cái đầu tiên và cuối cùng giống nhau. Tách chúng ra khỏi chuỗi và xác định xem chuỗi còn lại có phải là palindrome hay không. Lấy câu trả lời cho chuỗi nhỏ hơn này và sử dụng nó làm câu trả lời cho chuỗi gốc rồi lặp lại từ .

Chuỗi thao tác chỉ đang thay đổi chuỗi sang chữ hoa để bạn có thể nhập cái gì đó như 'XScsX'

3
public boolean isPalindrom(String text) { 
    StringBuffer stringBuffer = new StringBuffer(text); 
    return stringBuffer.reverse().toString().equals(text); 
} 
Các vấn đề liên quan