JAVA算法:回文字符串相关问题详解(回文字符串总结)

Q1. 编写一个工具方法判断给定的字符串是否为回文字符串

例如:给定一个字符串“aabbaa”,判断该字符串是否为回文字符串。

算法设计如下:

 /** 给定一个字符串,判断该字符串是否为一个回文字符串* start表示需要判断的起始位置* end表示需要判断的结束位置*/public static boolean isPalindrome(String input, int start, int end) {while (start < end) {if (input.charAt(start++) != input.charAt(end--))return false;}return true;}

完整的测试代码如下:

package com.bean.algorithm.palindromic;public class PalindromicUtils {/** 给定一个字符串,判断该字符串是否为一个回文字符串* start表示需要判断的起始位置* end表示需要判断的结束位置*/public static boolean isPalindrome(String input, int start, int end) {while (start < end) {if (input.charAt(start++) != input.charAt(end--))return false;}return true;}public static void main(String[] args) {// TODO Auto-generated method stubString str="aabbaa ";//String str="fafadabcbafdfdfas";//注意去掉字符串前后的空格str=str.trim();boolean flag=isPalindrome(str,0,str.length()-1);System.out.println("Flag is: "+flag);}}

程序运行结果;

Flag is: true


Q2. 求给定字符串中的最长回文子串

输入一个字符串,求出其中最长的回文子串。

子串的含义是:在原串中连续出现的字符串片段。

在求解这个问题的时候,一定要看清楚问题。不要混淆“子串”和“子序列”的概念。“子串”是指在源字符串中连续出现的字符串片段;而“子序列”是指在源字符串中可以不连续出现的字符串片段。一个连续,一个不连续。

回文的含义是:子串从左向右看和从右向左看是相同的,例如:abba,yyxyy。 在判断时忽略所有标点符号和空格,且忽略大小写,但是输出应保持原样。
输入字符串的长度不超过5000,且占据单独一行。 应该输出最长的回文串。如果有多个,输出起始位置最靠左的一个。

例如给定字符串:fafadabcbafdfdfas

其最长回文子串为:afdfdfa

算法设计如下:

package com.bean.algorithmexec;import java.io.FileNotFoundException;public class LongestPalindromeString3 {/**  * 输入一个字符串,求出其中最长的回文子串。 * 子串的含义是:在原串中连续出现的字符串片段。* 回文的含义是:子串从左向右看和从右向左看是相同的,例如:abba,yyxyy。 在判断时忽略所有标点符号和空格,且忽略大小写,但是输出应保持原样。* 输入字符串的长度不超过5000,且占据单独一行。 应该输出最长的回文串。如果有多个,输出起始位置最靠左的一个。*  *//** 动态规划算法* dp(i, j) 表示是否 s(i ... j) 能够形成一个回文字符串* 当 s(i) 等于 s(j) 并且  s(i+1 ... j-1) 是一个回文字符串时 dp(i, j) 的取值为 true* 当我们找到一个回文子字符串时,我们检查其是否为最长的回文字符串*/public static String longestPalindrome(String s) {// n表示字符串的长度int n = s.length();String res = null;// 定义一个dp数组boolean[][] dp = new boolean[n][n];// 外层循环控制从最后一个字符向第一个字符渐进for (int i = n - 1; i >= 0; i--) {// 内层循环控制for (int j = i; j < n; j++) {// dp数组元素dp[i][j] = s.charAt(i) == s.charAt(j) && (j - i < 3 || dp[i + 1][j - 1]);if (dp[i][j] && (res == null || j - i + 1 > res.length())) {res = s.substring(i, j + 1);}}}return res;}public static void main(String[] args) throws FileNotFoundException {// 读取输入的字符串String strdemo = "fafadabcbafdfdfas";String ANSWER = longestPalindrome(strdemo);System.out.println(ANSWER);}
}

程序运行结果:

afdfdfa

另外一种算法:

package com.bean.algorithmexec;public class LongestPalindromeString4 {static void printSubStr(String str, int low, int high) {System.out.println(str.substring(low, high + 1));}static int longestPalSubstr(String str) {int maxLength = 1; int start = 0;int len = str.length();int low, high;for (int i = 1; i < len; ++i) {low = i - 1;high = i;while (low >= 0 && high < len && str.charAt(low) == str.charAt(high)) {if (high - low + 1 > maxLength) {start = low;maxLength = high - low + 1;}--low;++high;}low = i - 1;high = i + 1;while (low >= 0 && high < len && str.charAt(low) == str.charAt(high)) {if (high - low + 1 > maxLength) {start = low;maxLength = high - low + 1;}--low;++high;}}System.out.print("最长回文子串为: ");printSubStr(str, start, start + maxLength - 1);return maxLength;}public static void main(String[] args) {String str = "fafadabcbafdfdfas";System.out.println("长度是: " + longestPalSubstr(str));}
}

程序运行结果为:

最长回文子串为: afdfdfa
长度是: 7


Q3. 对于给定的字符串输出所有可能的回文子串分区

例如:给定字符串 str = “bcc”

输出结果为:["b", "c", "c"], ["b", "cc"]

算法设计:

package com.bean.algorithm.palindromic;import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;public class PrintAllPalindrome {public static void main(String[] args) {String input = "abbcbba";//String input = "fafadabcbafdfdfas ";System.out.println("对于给定的字符串 " + input + " 的所有可能的回文分区 :");allPalPartitions(input);}private static void allPalPartitions(String input) {int n = input.length();// 用于存放所有回文子串( palindromic partitions)ArrayList<ArrayList<String>> allPart = new ArrayList<>();// 用于存放当前回文子串( palindromic partitions)Deque<String> currPart = new LinkedList<String>();// 递归调用方法生成所有分区部分allPalPartitonsUtil(allPart, currPart, 0, n, input);// 输出所有分区部分字符串for (int i = 0; i < allPart.size(); i++) {for (int j = 0; j < allPart.get(i).size(); j++) {System.out.print(allPart.get(i).get(j) + " ");}System.out.println();}}private static void allPalPartitonsUtil(ArrayList<ArrayList<String>> allPart, Deque<String> currPart, int start,int n, String input) {if (start >= n) {allPart.add(new ArrayList<>(currPart));return;}for (int i = start; i < n; i++) {// 如果子串  str[start..i] 是回文子串( palindrome)if (isPalindrome(input, start, i)) {currPart.addLast(input.substring(start, i + 1));allPalPartitonsUtil(allPart, currPart, i + 1, n, input);// 从当前分区中删除子串 str[start..i]currPart.removeLast();}}}// 判断字符串是否为回文字符串(Palindrome)的工具方法(utility function) private static boolean isPalindrome(String input, int start, int i) {while (start < i) {if (input.charAt(start++) != input.charAt(i--))return false;}return true;}}

程序运行结果:

对于给定的字符串 abbcbba 的所有可能的回文分区 :
a b b c b b a 
a b b c bb a 
a b bcb b a 
a bb c b b a 
a bb c bb a 
a bbcbb a 
abbcbba

JAVA算法:回文字符串相关问题详解(回文字符串总结)相关推荐

  1. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式

    java相关:详解Spring加载Properties配置文件的四种方式 发布于 2020-4-29| 复制链接 摘记: 一.通过 context:property-placeholder 标签实现配 ...

  2. C/C++实现回文质数(超详解)【沈七】

    C/C++实现回文质数(超详解) 题目链接 题目描述 输入样例 **题解部分** **完整代码** **未完待续** 参考文章 唤我沈七就行嘿嘿. 大一软件工程在读. 菜鸡蒟蒻想在博客中记录一些算法学 ...

  3. python判断是否回文_对python判断是否回文数的实例详解

    设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...

  4. JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...

  5. easyui js解析字符串_js相关:详解Jquery Easyui的验证扩展

    js相关:详解Jquery Easyui的验证扩展 发布于 2020-7-2| 复制链接 本文主要介绍了Jquery Easyui验证扩展,Easyui验证,Easyui校验,js正则表达式.具有一定 ...

  6. java mysbatis select_java相关:详解Mybatis中的select方法

    java相关:详解Mybatis中的select方法 发布于 2020-7-3| 复制链接 摘记: selectById方法根据id,查询记录 ```java public void updateRe ...

  7. java获取request body_HttpServletRequest获取body内容(字符串/二进制)详解

    首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取body内容(字符串/二进制)详解 获取HT ...

  8. 【JVM】对象存活判定算法、GC算法、STW、GC种类详解

    [JVM]对象存活判定算法.GC算法.STW.GC种类详解 文章目录 [JVM]对象存活判定算法.GC算法.STW.GC种类详解 GC主要关注的区域 垃圾标记阶段:对象存活判断 标记阶段:引用计数算法 ...

  9. Java垃圾回收(GC)机制详解

    Java垃圾回收(GC)机制详解 转自:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因 ...

最新文章

  1. vue 表格左右拖拽调整列宽_解决 | iview低版本实现表格拖拽,滚动条列宽计算问题...
  2. android升级gradle到3.4.1
  3. 第十五届全国大学生智能车竞赛 室外光电组线上选拔赛比赛流程
  4. Python--logging....实例应用
  5. BeeHive模块注册
  6. 直播预告 | 长文本知识抽取:基于语义分割的文档级三元组关系抽取
  7. 深度学习笔记之DenseNets
  8. SpringCloud(第 017 篇)电影微服务接入Feign,添加 fallbackFactory 属性来触发请求进行容灾降级...
  9. zip4j实现多线程压缩
  10. HTML5设备API 大批美女等你来摇一摇
  11. 第一章信息安全基础考试要点及真题分布
  12. 响应程度怎么填写_如何增加直邮营销的响应率?
  13. java 压缩 空目录_java zip压缩与解压-支持空目录,保留文件修改时间
  14. Apache创建虚拟目录绑定域名
  15. c语言贪吃蛇设计意义,C语言贪吃蛇设计理念.pdf
  16. 关闭windows端口的批处理命令
  17. Docker加速器配置
  18. python发送qq文件_怎么用qq邮箱发文件-十分钟教你使用Python发送邮件(复制可用)...
  19. 加菲猫经典语录(中英文对照)
  20. linux系统安装MySQL数据库安装保姆级教程及1045错误和2058问题解决

热门文章

  1. 刘升平 | 基于知识图谱的人机对话系统
  2. 2021年上半年软考及格分数线是多少?
  3. 2020最受欢迎的7个vue管理后台框架
  4. mysql error 1126_install plugin group_replication ERROR 1126 (HY000)
  5. 工程总承包系列之工程总承包合同中的优先受偿权
  6. Matlab里电抗模块,MATLABsimulink在电机中的仿真全解.ppt
  7. 高精度的乘除法(C++实现)
  8. 兼容火狐--常见问题修改
  9. 未来计划-2023.3.30
  10. My Eighty-sixth Page - 买股票的最佳时机Ⅲ - By Nicolas