回文
把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。
锦字回文
前秦时期,秦州刺史窦滔因得罪了苻坚的手下大官被流放到流沙县。夫妻天各一方,他的妻子苏蕙特地在一块锦缎上绣上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("烦烦烦烦"));
}
}
分享到:
2013-12-10 11:44
浏览 1647
评论