JAVA算法:回文字符串相关问题详解(回文字符串总结)
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算法:回文字符串相关问题详解(回文字符串总结)相关推荐
- java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式
java相关:详解Spring加载Properties配置文件的四种方式 发布于 2020-4-29| 复制链接 摘记: 一.通过 context:property-placeholder 标签实现配 ...
- C/C++实现回文质数(超详解)【沈七】
C/C++实现回文质数(超详解) 题目链接 题目描述 输入样例 **题解部分** **完整代码** **未完待续** 参考文章 唤我沈七就行嘿嘿. 大一软件工程在读. 菜鸡蒟蒻想在博客中记录一些算法学 ...
- python判断是否回文_对python判断是否回文数的实例详解
设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...
- JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解
java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...
- easyui js解析字符串_js相关:详解Jquery Easyui的验证扩展
js相关:详解Jquery Easyui的验证扩展 发布于 2020-7-2| 复制链接 本文主要介绍了Jquery Easyui验证扩展,Easyui验证,Easyui校验,js正则表达式.具有一定 ...
- java mysbatis select_java相关:详解Mybatis中的select方法
java相关:详解Mybatis中的select方法 发布于 2020-7-3| 复制链接 摘记: selectById方法根据id,查询记录 ```java public void updateRe ...
- java获取request body_HttpServletRequest获取body内容(字符串/二进制)详解
首页 > Java Web > SpringMvc应用 > HttpServletRequest HttpServletRequest获取body内容(字符串/二进制)详解 获取HT ...
- 【JVM】对象存活判定算法、GC算法、STW、GC种类详解
[JVM]对象存活判定算法.GC算法.STW.GC种类详解 文章目录 [JVM]对象存活判定算法.GC算法.STW.GC种类详解 GC主要关注的区域 垃圾标记阶段:对象存活判断 标记阶段:引用计数算法 ...
- Java垃圾回收(GC)机制详解
Java垃圾回收(GC)机制详解 转自:https://www.cnblogs.com/xiaoxi/p/6486852.html 一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因 ...
最新文章
- vue 表格左右拖拽调整列宽_解决 | iview低版本实现表格拖拽,滚动条列宽计算问题...
- android升级gradle到3.4.1
- 第十五届全国大学生智能车竞赛 室外光电组线上选拔赛比赛流程
- Python--logging....实例应用
- BeeHive模块注册
- 直播预告 | 长文本知识抽取:基于语义分割的文档级三元组关系抽取
- 深度学习笔记之DenseNets
- SpringCloud(第 017 篇)电影微服务接入Feign,添加 fallbackFactory 属性来触发请求进行容灾降级...
- zip4j实现多线程压缩
- HTML5设备API 大批美女等你来摇一摇
- 第一章信息安全基础考试要点及真题分布
- 响应程度怎么填写_如何增加直邮营销的响应率?
- java 压缩 空目录_java zip压缩与解压-支持空目录,保留文件修改时间
- Apache创建虚拟目录绑定域名
- c语言贪吃蛇设计意义,C语言贪吃蛇设计理念.pdf
- 关闭windows端口的批处理命令
- Docker加速器配置
- python发送qq文件_怎么用qq邮箱发文件-十分钟教你使用Python发送邮件(复制可用)...
- 加菲猫经典语录(中英文对照)
- linux系统安装MySQL数据库安装保姆级教程及1045错误和2058问题解决
热门文章
- 刘升平 | 基于知识图谱的人机对话系统
- 2021年上半年软考及格分数线是多少?
- 2020最受欢迎的7个vue管理后台框架
- mysql error 1126_install plugin group_replication ERROR 1126 (HY000)
- 工程总承包系列之工程总承包合同中的优先受偿权
- Matlab里电抗模块,MATLABsimulink在电机中的仿真全解.ppt
- 高精度的乘除法(C++实现)
- 兼容火狐--常见问题修改
- 未来计划-2023.3.30
- My Eighty-sixth Page - 买股票的最佳时机Ⅲ - By Nicolas