我试图找到最长的回文,给定一个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
答案 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条(尽管很长)。
免责声明:代码可能无法编译或工作,因为它在我的手机上被翻阅(但它有可能起作用)