`
zhuyufufu
  • 浏览: 138791 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论
阅读更多
回文

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

锦字回文

   前秦时期,秦州刺史窦滔因得罪了苻坚的手下大官被流放到流沙县。夫妻天各一方,他的妻子苏蕙特地在一块锦缎上绣上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("烦烦烦烦"));
	}

}

分享到:
评论

相关推荐

    回文判断实验报告 数据结构

    回文判断是一个常见的编程问题,尤其在数据结构和算法的学习中常常被用作示例。在本实验报告中,我们将探讨如何使用栈这种数据结构来判断一个字符串是否为回文。 首先,我们要理解什么是回文。回文是指一个字符串...

    回文判断程序栈和队列基本操作

    本话题聚焦于"回文判断程序",并涉及到"栈"和"队列"这两种基本数据结构的操作。回文是一种正读反读都能读通的字符串,如"level"或"madam"。在判断一个字符串是否为回文时,栈和队列可以发挥重要作用。 首先,我们来...

    C++实现的回文判断

    在本主题中,我们将深入探讨如何使用C++语言来实现一个回文判断的程序。这个程序的主要目标是接收一个字符串作为输入,然后检查这个字符串是否符合回文的定义。 首先,我们需要了解C++中的字符串处理。在C++中,...

    c++数据结构回文判断课程设计

    c++数据结构回文判断课程设计c++数据结构回文判断课程设计c++数据结构回文判断课程设计

    利用C++栈和队列实现回文判断

    利用C++栈和队列实现回文判断 可以自行输入

    回文判断,括号匹配,数制转换

    在IT领域,编程是解决问题的关键工具,而"回文判断,括号匹配,数制转换"是编程中常见的基础算法问题。以下将详细介绍这三个概念及其C++实现。 首先,我们来探讨**回文判断**。回文是指正读反读都能读通的字符串,...

    回文判断(C语言控制台程序)

    在编程领域,回文判断是一个常见的基础问题,适用于学习和练习字符串处理技巧。在这个名为“回文判断”的C语言控制台程序中,我们将探讨如何使用C语言实现这个功能。 首先,我们要理解C语言的基本语法和结构。C语言...

    回文判断(用到了栈和队列,可以执行)

    数据结构的一题题目,一般老师都会布置这样的题目,大家可以来下载

    回文判断,回文判断,试编写一个算法,判断依次读入的一个以@为结素符的字母序列

    "回文判断算法实现及数据结构应用" 在计算机科学中,回文判断是一个经典的问题,旨在判断一个字符串是否为回文。回文是指一个字符串,读取方式不变,小写字母和大写字母视为相同的字符。例如,"radar"是一个回文,...

    回文判断 JAVA实现

    在本项目中,我们使用Java编程语言,通过递归的方式实现了一个具有图形用户界面(GUI)的回文判断程序。下面将详细介绍这个项目中的关键知识点。 1. **Java基础**:首先,我们需要了解Java的基本语法,包括变量声明...

    回文判断_C语言_

    在编程领域,回文判断是一个常见的字符串处理问题。在给定的标题“回文判断_C语言_”中,我们可以理解到这是一个使用C语言编写的程序,它的主要任务是检查一个字符串是否为回文。回文是指一个字符串无论从左向右读...

    数据结构试验 回文判断

    在计算机科学中,回文判断是基础的数据结构和算法问题,常用于教学和面试,以考察编程者的逻辑思维和算法实现能力。 在数据结构试验中,回文判断通常会涉及到以下几个核心知识点: 1. 字符串处理:首先,我们需要...

    递归实现回文判断

    根据给定的文件信息,我们可以总结出以下关于“递归实现回文判断”的知识点: ### 一、回文概念 回文是指一个字符串从左到右读和从右到左读都是一样的字符串。例如,“abcba”、“madam”等都是回文字符串。 ### ...

    【MFC】回文判断软件

    **回文判断软件详解** 在计算机编程领域,回文是一种特殊的字符串,它正读和反读都是一样的,比如“上海自来水来自海上”。本篇将详细介绍一个基于MFC(Microsoft Foundation Classes)框架编写的回文判断软件,该...

    数据结构之回文判断

    实验要求用栈的基本基本操作实现判断是否为回文,则必须定义栈的初始化和出栈、入栈;另外为了判断是否是回文,则定义一个数组,便于比较。在字符串输入的时候,保证同时进入数组和栈里。因为栈的后进先出的输出特性...

    数据结构中,回文判断

    田鲁怀编写的数据结构课上用,但有点不详细,不能判断汉字字符串是否为回文

    数据结构实验 栈和队列 回文判断

    本次实验的主题是“数据结构实验”,重点关注栈和队列这两种基本数据结构,并利用它们来实现一个回文判断的功能。回文是一种特殊的字符串,其正读和反读是一样的,比如“上海自来水来自海上”。 首先,我们来看栈...

    回文判断.cpp

    回文判断.cpp 数据结构内容!

    回文判断的算法

    这是一个回文判断的算法,很详细 欢迎大家下载

    CPP实现的回文判断

    ### CPP实现的回文判断 #### 核心概念与实现逻辑 本文将详细介绍一个使用C++语言实现的回文判断程序。回文是指正读反读都一样的字符串,例如“level”、“madam”等。在计算机科学领域,判断一个字符串是否为回文...

Global site tag (gtag.js) - Google Analytics