回文串
(就是和高中语文提到过的有种诗叫回文诗是一样的本质,正读和反读都一样)
给定一个包含大小写的字符串,算出最长回文串的长度
/*回文串
* 给定一个包含大小写的字符串找,算出最长回文串的长度*/
import java.util.HashSet;
/*给定一个包含大写字母和小写字母的字符串,找到通过这些字母构成字母的最长回文串,在构造的过程中,注意区分大小写
* 比如Aa不能作为一个回文字符串
* 注意假设字符串的长度不会超过1010*/
public class soultion {
/*回文串是一个正读和反读都一样的字符串,比如level或者noond等就是回文串*/
/*示例:abccccdd*/
/*输出:7*/
/*解释我们可以构造的最长回文串是dccaccd,他的长度是7*/
/*思考可以构成回文串的两种情况
*字符出现次数为双数的组合
* 字符出现次数为双数的组合+一个只出现一次的字符串
* */
/*核心:统计字符出现的次数即可,双数才能构成回文,因为允许中间一个数单独出现比如“abcba”所以如果
最后有字母落单,总长度可以加1
*
* */
/*步骤:
* 首先将字符串转换为字符数组
* 遍历该数组
* 对应字符是不是在hashSet中,如果不在加进去,如果在就让count++,然后移除该该字符,这样就能找到字符出现次数为双数的
* 字符个数*/
public static void main(String[] args) {
String s="aba";
soultion soultion=new soultion();
int i = soultion.longestPalifindrome(s);
System.out.println(i);
}
/*这个方法传入一个String类型的字符串*/
public int longestPalifindrome(String s){
//首先判断这个字符串是不是长度为0
if(s.length()==0){
return 0;
}
//创建一个hashset来存放字符
//为什么要用hashset来存储呢 下面解答
//这个hashset里面存储了一个character 这是个包装类类型 集合里面要存储包装类类型 ,他是个对象
// 这也是包装类类型存在的意义
HashSet<Character> hashset=new HashSet<Character>();
//传进来的字符串转换为一个字符数组来存储
char[] chars = s.toCharArray();
//定义一个计数器
int count=0;
//遍历字符数组中的每一个元素
for (int i = 0; i <chars.length ; i++) {
//如果集合中的元素和char数组里面的元素不相等 就把char数组里面的元素加入到hashset中
//hashset存在就是为了这个方法
if(!hashset.contains(chars[i])){
//元素不相等就加入hashset
hashset.add(chars[i]);
}else {
//元素相等就移除这个元素
hashset.remove(chars[i]);
//实际上这个count才是关键
count++;//并把计数器加加
}
}
//判断hashset是不是空的 是空的 count*2 不是空的count*2+1;
//这样就可以把最长回文串的长度求出来
//有点像打牌里面的摸乌龟打打法。
return hashset.isEmpty()?count*2:count*2+1;
}
}