找到最长的回文,代码通过半测试案例

时间:2017-02-26 16:55:46

标签: java palindrome

我试图找到最长的回文,给定一个String s。问题指出它区分大小写,因此A' A' !=' a'。我下面的尝试通过了49/95的Leetcode测试用例,但我不知道我哪里出错...

public class Solution {
    public int longestPalindrome(String s) {
        if (s.equals("")) {
            return 0;
        }
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (map.containsKey(c)) {
                map.put(c, map.get(c) + 1);
            } else {
                map.put(c, 1);
            }
        }
        int total = 0;
        int greatestOdd = 0;
        for (Map.Entry<Character, Integer> entry : map.entrySet()) {
            int value = entry.getValue();
            if (value % 2 == 0) {
                total += value;
            } else {
                if (value > greatestOdd) {
                    greatestOdd = value;
                }
            }
        }
        total += greatestOdd;
        return total;

    }
}

这个想法是,回文由计数均匀的字符和一个具有奇数的字符(或者可能是0个奇数的字符)组成。所以我跟踪HashMap中的所有字符数。

然后我循环遍历HashMap中的所有值,如果它们是偶数,则添加到total。我也跟踪最大的奇数(如果没有带奇数的字母,则初始化为0)。

我认为这是正确的想法,但有些事情已经结束......

练习链接:https://leetcode.com/problems/longest-palindrome/?tab=Description

2 个答案:

答案 0 :(得分:3)

您的逻辑是正确的,但是一旦计算出最大的奇数值,就应该将其从地图中删除,并考虑所有其他字符出现奇数次。

你应该通过减去1并将它加到你的回文长度来制作它们:

我的代码:

public int longestPalindrome(String s) {
    HashMap<Character,Integer> map = new HashMap<>();
    for (Character c : s.toCharArray()) {
        if(map.containsKey(c)) {
            map.put(c,map.get(c)+1);
        } else {
            map.put(c,1);
        }
    }
    int maxOdd = 0;
    char maxOddChar = Character.MIN_VALUE;
    int palindromeLength = 0;
    for (Character c : map.keySet()) {
        if(map.get(c)%2==0) {
            palindromeLength += map.get(c);
        } else {
            if(maxOdd<map.get(c)) {
                maxOdd = map.get(c);
                maxOddChar = c;
            }
        }
    }
    palindromeLength += maxOdd;
    map.remove(maxOddChar);
    //Considering other odd characters as well  
    for (Character c : map.keySet()) {
        if(map.get(c)%2!=0) {
            palindromeLength += map.get(c)-1;
        }
    }
    return palindromeLength;
}
  

示例:aabbbcccccdd

Hashmap ->  a->2,b->3,c->5,d->2
Greatest odd value = c->5
Total palindrome length : a+d+c = 2+2+5 = 9

// But you are missing b->3 can also be added 
// in the palindrome, but using only 2 b's and neglecting 1

Total palindrome length : 9+2 = 11

答案 1 :(得分:0)

通常,简化代码会使一切变得清晰,几乎不会出现错误。例如:

List<Long> freqs = Arrays.stream(s.split("(<=.)")).stream()
  .collect(Collectors.groupingBy(o -> o, Collectors.counting()))
  .values();
long length = freq.stream().mapToLong(Long::longValue)
    .filter(n -> n % 2 == 0).sum() -
  freqs.stream().mapToLong(Long::longValue)
    .filter(n -> n % 2 == 1).max().orElse(0);

只有2条(尽管很长)。

免责声明:代码可能无法编译或工作,因为它在我的手机上被翻阅(但它有可能起作用)