检查回文string

回文是一个单词,短语,数字或其他顺序的单位,可以在任何方向读取相同的方式。

要检查一个单词是否是回文,我得到单词的字符数组并比较字符。 我testing了它,它似乎工作。 不过,我想知道这是对的还是有什么需要改进的。

这是我的代码:

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

为什么不只是:

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

例:

input是“安娜”。
i1将是0,i2将是4。

第一次循环迭代,我们将比较word[0]word[4] 。 他们是平等的,所以我们递增i1(现在是1),递减i2(现在是3)。
所以我们然后比较n的。 他们是平等的,所以我们增加i1(现在是2)和减lessi2(它是2)。
现在i1和i2是相等的(它们都是2),所以while循环的条件不再是真的,所以循环终止,我们返回true。

你可以检查一个string是否是一个回文,通过比较它自身的反向:

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

或者对于早于1.5版本的Java版本,

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

编辑: @FernandoPelliccioni提供了这个解决scheme的效率(或缺乏),在时间和空间方面的非常透彻的分析 。 如果您对这个问题的计算复杂性和其他可能的解决scheme感兴趣,请阅读它!

一个简洁的版本,不涉及(低效)初始化一堆对象:

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

或者, recursion

对于任何正在寻找一个更短的recursion解决scheme的人来说,检查给定的string是否满足回文:

 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; else return s.charAt(0) != s.charAt(length - 1) ? false : isPalindrome(s.substring(1, length - 1)); } 

去,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 
 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){ 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{ for(int i = 0; i < (wort.length-1)/2-1; i++){ if(wort[i] != wort[wort.length-i-1]){ return false; } } } return true; } } 

也是一个不同的解决scheme:

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

检查回文的前半部分与其余部分,这种情况下,假设删除任何空格。

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

这里有一个完整的Java 8 stream媒体解决scheme。 一个IntStream提供所有索引直到string长度的一半,然后从开始到结束进行比较。

 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 

我为一个被标记为重复的问题的解决scheme工作。 不妨把它扔在这里…

这个问题要求一条线来解决这个问题,我更多地把它作为文学回文 – 所以空格,标点符号和大写/小写可以抛弃结果。

这是一个小testing课的难题:

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

对不起,这是一种讨厌 – 但另一个问题指定一个class轮。

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

}

试试这个:

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

我是新来的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. 如果string不是由字母或只是一个字母组成,那么它就是一个回文。
  2. 否则,比较string的第一个和最后一个字母。
    • 如果第一个和最后一个字母不同,那么string不是回文
    • 否则,第一个和最后一个字母是相同的。 将它们从string中剥离,并确定剩下的string是否是回文。 取这个较小的string的答案,并用它作为原始string的答案,然后从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; } 

在这里我分析@Greg答案: componentsprogramming.com/palindromes


旁注:但是,对我来说,以通用的方式来完成这一点非常重要。 要求是序列是双向迭代的,序列的元素是使用相等的可比较的。 我不知道如何在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迭代

  • 如果我是双向迭代器:floor(n / 2)comparissons和floor(n / 2)* 2迭代加(3/2)* n迭代find中间函数(中间函数)

  • 存储:O(1)

  • 没有dynamic分配的内存


最近我写了一个不使用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; } 

使用堆栈,可以这样做

 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"); } } } 
  public static boolean isPalindrome(String word) { String str = ""; for (int i=word.length()-1; i>=0; i--){ str = str + word.charAt(i); } if(str.equalsIgnoreCase(word)){ return true; }else{ return false; } } 

另一种方法是使用char数组

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

}

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

我正在寻找一个解决scheme,不仅适用于回文如…

  • “皮艇”
  • “夫人”

…但也是…

  • “一个男人,一个计划,一条运河,巴拿马!”
  • “我看到的是汽车还是猫?”
  • “尼克松没有'x'

迭代 : 这已被certificate是一个很好的解决scheme。

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

recursion 。 我认为这个解决scheme不应该比迭代更糟糕。 我们需要一点点Crapy来提取清除步骤,避免不必要的处理。

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

逆向 : 这已被certificate是一个昂贵的解决scheme。

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

所有的信用回答这个职位的人,并为这个话题带来光明。

考虑到字中不是字

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

在这里你可以dynamic地检查回文数字的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); } } 

国际海事组织,recursion的方式是最简单和最清晰的。

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

在这里,检查string中最大的回文,始终从第一个字符开始。

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

代码片段:

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

在这里输入图像描述

 import java.util.Collections; import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class GetAllPalindromes { static Scanner in; public static void main(String[] args) { in = new Scanner(System.in); System.out.println("Enter a string \n"); String abc = in.nextLine(); Set a = printAllPalindromes(abc); System.out.println("set is " + a); } public static Set<CharSequence> printAllPalindromes(String input) { if (input.length() <= 2) { return Collections.emptySet(); } Set<CharSequence> out = new HashSet<CharSequence>(); int length = input.length(); for (int i = 1; i < length - 1; i++) { for (int j = i - 1, k = i + 1; j >= 0 && k < length; j--, k++) { if (input.charAt(j) == input.charAt(k)) { out.add(input.subSequence(j, k + 1)); } else { break; } } } return out; } } **Get All Palindrome in s given string** 

输出 D:\ Java> java GetAllPalindromesinput一个string

你好用户nitin是我最好的朋友哇!

答案是 [nitin,nitin,哇,哇,iti]

d:\的Java>

For-loop包含sub.length() / 2 - 1 。 必须减去1,因为string中间的元素不必检查。

例如,如果我们必须检查7个字符的string(1234567),那么7/2 => 3,然后我们减去1,因此string中的位置将变成(0123456)。 字符检查与分别为0,1,2和6,5,4。 我们不关心位置3的元素,因为它位于string的中间。

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