20250525 finished.

This commit is contained in:
jackfiled 2025-05-25 17:00:43 +08:00
parent 993535a05b
commit 1a9ecb53eb
2 changed files with 86 additions and 0 deletions

View File

@ -674,3 +674,5 @@ mod p3362_zero_array_transformation_iii;
mod p3068_find_the_maximum_sum_of_node_values; mod p3068_find_the_maximum_sum_of_node_values;
mod p2942_find_words_containing_character; mod p2942_find_words_containing_character;
mod p2131_longest_palindrome_by_concatenating_two_letter_words;

View File

@ -0,0 +1,84 @@
/**
* [2131] Longest Palindrome by Concatenating Two Letter Words
*/
pub struct Solution {}
// submission codes start here
use std::collections::HashMap;
impl Solution {
pub fn longest_palindrome(words: Vec<String>) -> i32 {
let mut counter = HashMap::new();
let mut same_counter = HashMap::new();
for word in words.iter() {
let mut chars = word.bytes();
let first = (chars.next().unwrap() - b'a') as i32;
let second = (chars.next().unwrap() - b'a') as i32;
if first < second {
let hash = first * 26 + second;
let entry = counter.entry(hash).or_insert((0, 0));
entry.0 += 1;
} else if first > second {
let hash = second * 26 + first;
let entry = counter.entry(hash).or_insert((0, 0));
entry.1 += 1;
} else {
let entry = same_counter.entry(first).or_insert(0);
*entry += 1;
}
}
// 对于两个不同的字符
// 取计数的最小值
let mut result: i32 = counter
.values()
.filter_map(|&(x, y)| Some(x.min(y) * 4))
.sum();
// 对于两个相同的字符
// 如果成对就可以加入答案
result += same_counter
.values()
.filter_map(|&v| Some(v / 2 * 4))
.sum::<i32>();
// 再判断是否有落单的相同字符放在中间
// 注意只能放一次
result += same_counter
.values()
.filter_map(|&v| if v % 2 != 0 { Some(()) } else { None })
.next()
.map_or(0, |()| 2);
result
}
}
// submission codes end
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_2131() {
assert_eq!(
6,
Solution::longest_palindrome(vec_string!("aa", "aa", "aa"))
);
assert_eq!(
6,
Solution::longest_palindrome(vec_string!["lc", "cl", "gg"])
);
assert_eq!(
8,
Solution::longest_palindrome(vec_string!["ab", "ty", "yt", "lc", "cl", "ab"])
);
assert_eq!(
2,
Solution::longest_palindrome(vec_string!["ll", "cc", "xx"])
);
}
}