LeetCode-409-Longest Palindrome(求字符串可组成的最长回文长度)

问题描述如下:

Given a string which consists of lowercase or uppercase letters, find the length of the longest palindromes that can be built with those letters.

This is case sensitive, for example "Aa" is not considered a palindrome here.

翻译过来意思就是,丢进来一个可能大小写混合的字符串,让你求出来用这些字符可以组成的最长回文长度.

啥是回文?

AaaA,aaaa,acdca像这样正着看倒着看都一个样儿的就是回文.

再瞅瞅它给的Example:

Input:
"abccccdd"

Output:
7

Explanation:
One longest palindrome that can be built is "dccaccd", whose length is 7.

这么一看就完全明白了啊!特丫的就是让你组合组合看看最长能整出来个多长的回文字符串嘛!

那么,撸一撸思路,怎么求这个长度呢?

①回文分两种类型: 奇数型回文和偶数型回文,即有没有作为"中轴"的字符;

②回文存在的基础是有重复字符(长度为1的字符串除外);

③可组成的最长回文长度跟重复字符的数量有直接关系.

so,可以想象出以下几种情况:

①字符串中的每个字符都是重复的,且重复数量为偶数个,类似aabbbbcc这样的,那它的最长回文长度显然是等于字符串本身的长度的;

②字符串中存在偶数重复字符,但是也同时存在不重复的字符,类似aabbcde这样的,脑袋运算了三分之一秒之后我们发现,回文的中轴只需要一个字符,即我们只用取cde中的任意一个作为中轴就可以了.这时最长回文长度为重复字符个数+1;

③字符串中存在奇数重复字符,再想三分之一秒后我们发现,多余的那个重复字符可以跟其他非重复字符一样作为中轴,随便取一个就得了;

soso,我们发现,只用求出重复字符的数目再判断一下重复字符的数量是奇数还是偶数就OK啦!

算法的思路如下:

实例化一个HashMap出来存放重复字符和它们对应的个数,

①把字符串分为前半段和后半段:以abccdd为例,第一次前后段字符串分别为a和bcdd,第二次分别为abcdd,依次这样往后移动;

②从后半段字符串中取第一个字符,判断其是否包含在前半段中(是否是重复字符):

若包含,则取出以该字符为key的value值,这个value值啊就是当前这个字符的重复次数,把它"喜加一"之后再put到原来的HashMap里面去;

若不包含,则以该字符为key,2为value一块打包put到HashMap里面去.

③整个字符串遍历结束以后,遍历整个HashMap,就可以得到每个重复字符的重复次数了,最后加加加再判断一下子结果揪出来啦!!!!

Java代码如下:

public class Solution {
	public int longestPalindrome(String s) {
		if(s == null){
			return 0;
		}
		int result = 1;
		HashMap<String, Integer> hash = new HashMap<String, Integer>();
		for (int i = 1; i < s.length(); i++) {
			String pre = s.substring(0, i);
			String cursor = String.valueOf(s.charAt(i));
			if(pre.contains(cursor)){
				if(hash.get(cursor) != null){
					int value = hash.get(cursor);
					hash.put(cursor, value+1);
				}else{
					hash.put(cursor, 2);
				}
			}
		}

		Iterator<String> iter = hash.keySet().iterator();
		while(iter.hasNext()){
			String key = iter.next();
			int value = hash.get(key);
			if((value > 1) && (value % 2 == 0)){
				result += value;
			}else{
				result += value - 1;
			}
		}
		
		if(result == (s.length()+1)){
			result--;
		}
		return result;
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值