java判断回文用valueof_回文判断 - 平行宇宙 - ITeye博客

本文介绍了多种Java实现回文判断的方法,包括使用StringBuffer翻转、双指针遍历和递归算法。通过这些算法,可以判断一个字符串是否为回文,并分析不同算法的优劣。
摘要由CSDN通过智能技术生成

回文

把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。

锦字回文

前秦时期,秦州刺史窦滔因得罪了苻坚的手下大官被流放到流沙县。夫妻天各一方,他的妻子苏蕙特地在一块锦缎上绣上840个字,纵横29个字的方图,可以任意地读,共能读出3752首诗,表达了她对丈夫的思念与关心之情。 后遂以“锦字书”等指前秦苏蕙寄给丈夫的织锦回文诗。“锦字”典出于前秦窦滔之妻苏蕙,织锦为回文《璇玑图》诗,赠其夫。后世因称“锦字”为妻寄夫之信。

回文判断通常是面试常用的题目,写出多种回文判断算法,从内存占用及执行时间优化角度衡量算法优劣,是面试的重点。

程序判断一个字符串是否为回文

本文为算法优化思考类文章,故而会介绍几种回文判断算法。

首先展示最简单的回文判断算法:将字符串翻转判断其是否相同。

Java代码展示如下:

package com.zas.test;

/**

* 判断一个字符串是否为回文

* @author zas

*/

public class Palindrome {

/**

* 判断一个字符串是否为回文

* @param inputString

* @return true / false

*/

public static boolean isPalindrome(String inputString) {

if(null == inputString || "".equals(inputString.trim())){

return true;

}

StringBuffer sb = new StringBuffer(inputString);

String reversedString = sb.reverse().toString();

if(inputString.equals(reversedString)){

return true;

}

return false;

}

/**

* @param args

*/

public static void main(String[] args) {

System.out.println(Palindrome.isPalindrome("abc"));

System.out.println(Palindrome.isPalindrome("aba"));

System.out.println(Palindrome.isPalindrome(""));

System.out.println(Palindrome.isPalindrome(" "));

System.out.println(Palindrome.isPalindrome(null));

}

}

上面这个程序可能不是最好的回文算法,但是它展示了对StringBuffer里的reverse的理解掌握。

下面写一下reverse函数:

/**

* 判断一个字符串是否为回文

* @param inputString

* @return true / false

*/

public static boolean isPalindrome(String inputString) {

if(null == inputString || "".equals(inputString.trim())){

return true;

}

//StringBuffer sb = new StringBuffer(inputString);

//String reversedString = sb.reverse().toString();

String reversedString = reverse(inputString);

if(inputString.equals(reversedString)){

return true;

}

return false;

}

/**

* 翻转一个字符串

* @param inputString

*/

private static String reverse(String inputString) {

if(null == inputString || "".equals(inputString.trim())){

return inputString;

}

char[] charArray = new char[inputString.length()];

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

charArray[j] = inputString.charAt(i);

}

return String.valueOf(charArray);

}

有兴趣的朋友可以查看一下StringBuffer的reverse实现,并尝试改进上面的字符串翻转程序。

下面介绍另一种回文判断算法:从字符串两头遍历,一个一个字符比较到中间。算法也是非常好理解的。

Java实现如下:

/**

* 判断一个字符串是否为回文

* @param inputString

* @return true / false

*/

public static boolean isPalindrome(String inputString) {

//通过翻转字符串实现字符串回文判断

//return isPalindromeByReverse(inputString);

//通过两头遍历实现字符串回文判断

return isPalindromeByTraverseBothEnds(inputString);

}

private static boolean isPalindromeByTraverseBothEnds(String inputString) {

if(null == inputString || "".equals(inputString.trim())){

return true;

}

//获得中间长度

int len = inputString.length() / 2;

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

if(inputString.charAt(i) != inputString.charAt(j)){

return false;

}

}

return true;

}

另外一种解决问题的思路是采用递归算法

/**

* 判断一个字符串是否为回文

* @param inputString

* @return true / false

*/

public static boolean isPalindrome(String inputString) {

//通过翻转字符串实现字符串回文判断

//return isPalindromeByReverse(inputString);

//通过两头遍历实现字符串回文判断

//return isPalindromeByTraverseBothEnds(inputString);

//递归算法解决问题

return isPalindromeByRecursion(inputString);

}

/**

* 递归算法解决问题

* @param inputString

* @return

*/

private static boolean isPalindromeByRecursion(String inputString) {

if(null == inputString || "".equals(inputString.trim())){

return true;

}

char[] charArray = inputString.toCharArray();

int length = inputString.length();

return fun(0, length-1, charArray, length);

}

private static boolean fun(int low, int high, char[] str, int length) {

if (length == 0 || length == 1) {

return true;

}

if (str[low] != str[high]) {

return false;

}

return fun(low + 1, high - 1, str, length - 2);

}

各种算法的优劣不能凭直观感觉,以后将尽量做一个算法基准测试来衡量。

最后给出整个Java代码:

package com.zas.test;

/**

* 判断一个字符串是否为回文

* @author zas

*/

public class Palindrome {

/**

* 判断一个字符串是否为回文

* @param inputString

* @return true / false

*/

public static boolean isPalindrome(String inputString) {

//通过翻转字符串实现字符串回文判断

//return isPalindromeByReverse(inputString);

//通过两头遍历实现字符串回文判断

//return isPalindromeByTraverseBothEnds(inputString);

//递归算法解决问题

return isPalindromeByRecursion(inputString);

}

/**

* 递归算法解决问题

* @param inputString

* @return

*/

private static boolean isPalindromeByRecursion(String inputString) {

if(null == inputString || "".equals(inputString.trim())){

return true;

}

char[] charArray = inputString.toCharArray();

int length = inputString.length();

return fun(0, length-1, charArray, length);

}

private static boolean fun(int low, int high, char[] str, int length) {

if (length == 0 || length == 1) {

return true;

}

if (str[low] != str[high]) {

return false;

}

return fun(low + 1, high - 1, str, length - 2);

}

private static boolean isPalindromeByTraverseBothEnds(String inputString) {

if(null == inputString || "".equals(inputString.trim())){

return true;

}

//获得中间长度

int len = inputString.length() / 2;

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

if(inputString.charAt(i) != inputString.charAt(j)){

return false;

}

}

return true;

}

/**

* 通过翻转字符串实现回文判断

* @param inputString

* @return true / false

*/

private static boolean isPalindromeByReverse(String inputString) {

if(null == inputString || "".equals(inputString.trim())){

return true;

}

//得到翻转字符串

//StringBuffer sb = new StringBuffer(inputString);

//String reversedString = sb.reverse().toString();

String reversedString = reverse(inputString);

if(inputString.equals(reversedString)){

return true;

}

return false;

}

/**

* 翻转一个字符串

* @param inputString

*/

private static String reverse(String inputString) {

if(null == inputString || "".equals(inputString.trim())){

return inputString;

}

char[] charArray = new char[inputString.length()];

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

charArray[j] = inputString.charAt(i);

}

return String.valueOf(charArray);

}

/**

* @param args

*/

public static void main(String[] args) {

System.out.println(Palindrome.isPalindrome("abc"));

System.out.println(Palindrome.isPalindrome("aba"));

System.out.println(Palindrome.isPalindrome(""));

System.out.println(Palindrome.isPalindrome(" "));

System.out.println(Palindrome.isPalindrome(null));

System.out.println(Palindrome.isPalindrome("烦烦"));

System.out.println(Palindrome.isPalindrome("烦烦烦烦"));

}

}

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2013-12-10 11:44

浏览 1647

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值