java最长回文子序列_在一个字符串里面怎么找出最长回文子序列长度
回文字符串是什么?类似于level,noon,abbba这种,就是从左读和从右读都是同一个字符串。。。。
先说一下我的思路:
比如现在有字符串:”12212321“
1,先在每个字符间隔的地方放一个“#”,这样做的目的是为了不用对字符串进行奇偶的分类讨论,这个字符串变成“#1#2#2#1#2#3#2#1#”;
2,把“#1#2#2#1#2#3#2#1#”变成一个字符数组;
3,开始遍历这个字符数组:
(1)i 表示当前字符的下标,定义两个变量,toLeft表示从当前下标开始向左移动的下标,toRight表示从当前下表开始向右移动的下标;
(2)定义一个boolean变量 find,表示在toLeft和toRight移动过程中是否已经找到最长的回文子字符串,定义一个radio的int变量表示回文子字符串的半径;
(3)定义一个和字符串一样长度的int数组radios存放已每个字符为中心的回文子序列的最大半径;
(4)toLeft向左移动的同时toRight向右移动,判断toLeft对应字符和toRight对应字符是否相等,如果相等半径就加1,不相等表示已经找到最长回文子字符串,把radio 放进radios数组;
(5)如果找到回文子字符串,find = true;
(6)toLeft和toRight在移动中要保证不能越界;
4,具体代码
package com.lin.test;
public class Huiwen {
public static void main(String[] args) {
System.out.println("12212321--------------------"+new Huiwen().maxHuiwen("12212321"));
}
private int maxHuiwen(String str){
char[] chars = str.toCharArray();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append('#');
for(int i=0;i
stringBuilder.append(chars[i]);
stringBuilder.append('#');
}
char[] temp = stringBuilder.toString().toCharArray();
int[] radios = new int[temp.length];//存放当前字符为中心的构成回文字符串的最大半径
for(int i=0;i
boolean find = false;//在当前字符中,是否已经找到以当前字符为中心的回文字符串
int toLeft = i;
int toRight = i;
int radio = 1;//半径
while(!find){
toLeft --;//左移
toRight++;//右移
if(toLeft temp.length - 1){//如果越界,跳出
break;
}
if(temp[toLeft] == temp[toRight]){
radio ++;//半径+1
}
else {
find = true;
}
}
radios[i] = radio;
}
/**
* 找出radios中最大值就是最长子序列长度
*/
for (int i = 0; i
System.out.print(temp[i]+"\t");
}
System.out.println();
int max = -1;
for(int i=0;i
System.out.print(radios[i]+"\t");
if(radios[i] > max){
max = radios[i];
}
}
System.out.println();
return max;
}
}
5,运行结果
# a # c # b # c # a # a # c # b # c # d #
1 2 1 2 1 6 1 2 1 2 9 2 1 2 1 4 1 2 1 2 1
可以看到最长的半径是9,那么该字符串的最长回文子序列长度就是9-1=8;
java最长回文子序列_在一个字符串里面怎么找出最长回文子序列长度相关推荐
- 找出最具竞争力的子序列_力扣300——最长上升子序列
这道题主要涉及动态规划,优化时可以考虑贪心算法和二分查找. 原题 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18]输出: 4 解释: ...
- java小编程----给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
package com.henu;import java.util.Arrays;/*** @author limengdong* @date 2019年7月19日* @classroom 208bi ...
- 找出最具竞争力的子序列_每日算法系列【LeetCode 376】摆动序列
题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...
- java中double身高_用JAVA编一个程序 输入10名同学的身高,找出最高升高,要求使用对象数组类型的带参方法来实现...
用JAVA编一个程序 输入10名同学的身高,找出最高升高,要求使用对象数组类型的带参方法来实现 关注:285 答案:5 mip版 解决时间 2021-02-05 07:44 提问者女人不需要倾国倾 ...
- LeetCode 5485. 找出最长的超赞子字符串 (状态压缩、二进制、位运算、前缀和)
5485. 找出最长的超赞子字符串 题意: 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次 ...
- 1542. 找出最长的超赞子字符串 哈希+状态压缩
1542. 找出最长的超赞子字符串 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次数的字符 ...
- leetcode 5485. 找出最长的超赞子字符串
5485. 找出最长的超赞子字符串 给你一个字符串 s .请返回 s 中最长的 超赞子字符串 的长度. 「超赞子字符串」需满足满足下述两个条件: 该字符串是 s 的一个非空子字符串 进行任意次数的字符 ...
- 现代密码学—密码学基本编码实践 16进制向base64编码转换 等长16进制字符串异或 找出密钥并破解密文 python
实验地点:E楼III区503 实验时间:11.17 一.实验室名称:攻防实验室 二.实验项目名称:密码学基本编码实践 三.实验学时:6学时 四.实验原理: Base64是网络上最常见的用于传输8Bit ...
- 快速找出两个Word文档之间的差别
我们经常会遇到这样的问题:两份Word文件之中,只有一些极为细小的区别,如果单纯通过人工的方法去进行校对,那么不仅效率很低,而且也容易出错,容易漏掉一些不太明显的区别.Word 2003已经内置了一个 ...
最新文章
- 编程之美-重建二叉树方法整理
- java实现遍历树形菜单方法——HibernateUtil实现
- 吴恩达深度学习笔记10-Course4-Week1【卷积神经网络】
- 001_汽车之家,新浪和360之间的交流
- SMI/慧荣/SM32**主控量产通用教程,PNY U盘量产!
- 我的世界服务器显示outofmemory,游戏中out of memory解决办法分享
- 在 Mac 上的“快捷指令”中如何调整基本隐私设置?
- 台达EH3系列PLC进行MODBUS RTU通信的具体方法和步骤(非常详细)
- Java判断字符串是否为空的几种方法
- 干货 | 每天十亿级数据更新,秒出查询结果,ClickHouse在携程酒店的应用
- startActivitystartActivities有什么不同?
- 用缠论做量化(买卖点/品种机会/策略应用全解读)
- html5编辑文章如何缩进,关于网页排版和文章编辑那些事
- java bigdecimal.round_down,java BigDecimal 的 setScale() 方法的 BigDecimal.ROUND_DOWN 舍入模式的BUG,坑...
- 开放下载 | 2022阿里妈妈技术年刊来啦!
- 《数据之美》读书笔记
- js数组查找最接近_js 2种方法从数组里面找到最接近某个数值的值(小于该指定值,并且大于其他值)...
- QT-磨砂玻璃效果实现
- 2021-2025年中国半导体硅片行业市场供需与战略研究报告
- 复制和克隆数组,实现数组空间自动增长