检查回文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; } } } }
- 如果string不是由字母或只是一个字母组成,那么它就是一个回文。
- 否则,比较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; }