回文

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

锦字回文

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

评论

java判断回文用valueof_回文判断 - 平行宇宙 - ITeye博客相关推荐

  1. html左文右图布局方法,Divi主题如何实现博客列表拆分布局【图左文右】

    Divi主题是一款优秀的 Divi主题如何实现博客列表拆分布局[图左文右]? 其实我们只需要写几行CSS,然后博客里使用高级CSS类即可. 首先需要把下面的CSS放到主题选项里的自定义CSS里面: @ ...

  2. java httpresponse headres属性,Http Header里的Content-Type - 飞鸿影~ - 博客园

    之前一直分不清楚post请求里Content-Type方式,如 application/x-www-form-urlencoded . multipart/form-data .本文会介绍Conten ...

  3. mongo java 注解,在Java中使用Spring Data MongoDB操作Mong | zifangsky的个人博客

    前言:在上一篇文章中(PS:https://www.zifangsky.cn/923.html)我简单介绍了如何在Linux中安装MongoDB以及MongoDB的增删改查等基本命令用法(PS:更多M ...

  4. java web论文_(定稿)毕业论文基于JavaWeb技术博客项目的设计论文(完整版)最新版...

    <[毕业论文]基于Java Web技术博客项目的设计论文.doc>由会员分享,可免费在线阅读全文,更多与<(定稿)毕业论文基于Java Web技术博客项目的设计论文(完整版)> ...

  5. java输出当前时间_JAVA中获取当前系统时间 - Matrix54 - 博客园

    JAVA中获取当前系统时间 - Matrix54 - 博客园 一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleD ...

  6. java课程设计抽奖程序源码_java课程设计---个人博客 彩票抽奖程序 201821123098 钟海清...

    1.团队课程设计博客链接 2.个人负责模块或任务说明 我主要负责主要负责管理员类,实现滚动抽奖.自动注册购买彩票以及查看中奖信息和用户信息的方法 3.自己的代码提交记录截图 4.自己负责模块或任务详细 ...

  7. Ubuntu完全使用文档_我是亲民_新浪博客

    Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...

  8. api服务器开发语言,【API编写】介绍一个国内强大的API接口文档写作网站showdoc - 最好的编程语言 - 博客园...

    这几天要写一个接口API文档,经理给我发过来一个,说要弄一个这样的接口文档,我一看,这可麻烦呀,有大纲有详细,我以为要用div+css去一个页面一个页面做呢,这工作量可不小,网站一搜索,竟然有可以直接 ...

  9. 个人博客管理系统_教程 | 一文搭建你的第一个免费专属博客

    点击蓝字关注我 本文将详细介绍利用Github+hexo搭建一个免费.简洁的个人博客,从获取域名到菜单栏.搜索框.评论分享这些必要功能的配置,给自己一个个性化的内容分享平台. -▼- 我建了一个QQ学 ...

最新文章

  1. DNA Consensus String
  2. Android 系统性能优化(74)---如何减少lowmemory的发生几率
  3. 06_LR和最大熵模型_统计学习方法
  4. java中数组下标越界对应的异常类是_Java 常见异常种类
  5. 论文相关------如何在论文写作中使用拉丁文简写
  6. 辨析:工作路径与脚本路径
  7. 私藏了好几年的20个谷歌搜索技巧
  8. App Extension应用扩展
  9. 苹果手表GPS和蜂窝有什么区别
  10. Taylor Swift -- Crazier 附英文和中文歌词
  11. 向量范数(Norms)之间关系的证明
  12. tsp问题——遗传算法解决
  13. 这世上没有末路,你从不曾孤独
  14. 【备忘】AAD Intune维护
  15. matlab给程序加总标题,【转】matlab标题,给figure加标题,subplot的部分用法
  16. Linux chmod命令用法
  17. c语言设计函数删除大写字母,C语言第七周作业
  18. 爱码物联SaaS-防伪追溯系统在白酒行业的应用
  19. android加载ftp图片,按键安卓版网络访问之 图片处理,FTP,HTTP 实现
  20. 全球及中国深紫外LED行业十四五规划及前景战略研究报告2021-2027年版

热门文章

  1. 2016年12月计算机等级考试,2016年12月计算机二级考试练习
  2. 利用nid修改数据库的DBID
  3. NUCLEO STM32H743购买和使用说明
  4. SitePoint播客#127:Chris CoyierCSS技巧
  5. 示例库 - 超过50个流程图 (Collection: Over 50 Flowchart Examples)
  6. 卸载 UniAccessAgent 软件
  7. 铯辐射原子钟的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. 初中数学503个必考知识点_初中数学:21个必考知识点+重难点!打印背熟,3年不下130+!...
  9. 腾讯人均月薪7.5w,我这是又被平均了?
  10. Intellij IDEA 查看所有断点