第八部分:贪心
409.最长回文串(简单)
给定一个包含大写字母和小写字母的字符串 s
,返回通过这些字母构造成的最长的回文串 的长度。
在构造过程中,请注意 区分大小写 。比如 "Aa"
不能当做一个回文字符串。
示例 1:
输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
示例 2:
输入:s = "a" 输出:1 解释:可以构造的最长回文串是"a",它的长度是 1。
import java.util.HashMap;
import java.util.Map;
class Solution {
public int longestPalindrome(String s) {
// 检查字符串是否为空
if (s.length() == 0) {
return 0; // 如果字符串为空,直接返回0
}
int sum = 0; // 用于存储可以构成的最长回文串的长度
boolean hasOddValue = false; // 用于跟踪是否存在奇数值的键
Map<Character, Integer> map = new HashMap<>(); // 创建一个HashMap来存储字符及其出现次数
// 遍历字符串中的每个字符
for (char ch : s.toCharArray()) {
// 更新字符的出现次数
map.put(ch, map.getOrDefault(ch, 0) + 1);
}
// 遍历字符计数的映射
for (Map.Entry<Character, Integer> entry : map.entrySet()) {
int value = entry.getValue(); // 获取当前字符的出现次数
if (value % 2 == 0) { // 如果出现次数是偶数
sum += value; // 偶数部分可以完全加入到回文串中
} else { // 如果出现次数是奇数
sum += (value - 1); // 奇数部分减一后加入到回文串中
hasOddValue = true; // 标记存在奇数值的键
}
}
// 如果存在奇数值的键,则可以在回文串的中心添加一个字符
if (hasOddValue) {
sum += 1; // 增加1以考虑中心字符
}
return sum; // 返回计算得到的最长回文串长度
}
// 辅助方法:检查字符串中的所有字符是否相同
private boolean allCharactersSame(String s) {
char firstChar = s.charAt(0); // 获取第一个字符
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) != firstChar) {
return false; // 如果发现不同的字符,返回false
}
}
return true; // 所有字符相同,返回true
}
}
class Solution {
public int longestPalindrome(String s) {
// 创建一个长度为128的数组,用于统计字符的出现次数
int[] count = new int[128];
int length = s.length();
// 遍历字符串,统计每个字符的出现次数
for (int i = 0; i < length; ++i) {
char c = s.charAt(i);
count[c]++; // 增加字符c的计数
}
int ans = 0; // 用于存储最长回文串的长度
// 遍历计数数组,计算可以构成的回文串长度
for (int v : count) {
ans += v / 2 * 2; // 将偶数部分直接加到ans中
// 如果当前字符的出现次数为奇数,并且ans是偶数,则可以加1
if (v % 2 == 1 && ans % 2 == 0) {
ans++; // 可以在回文串的中心添加一个字符
}
}
return ans; // 返回计算得到的最长回文串长度
}
}
455.分发饼干(简单)
题目:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。
对每个孩子 i
,都有一个胃口值 g[i]
,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j
,都有一个尺寸 s[j]
。如果 s[j] >= g[i]
,我们可以将这个饼干 j
分配给孩子 i
,这个孩子会得到满足。你的目标是满足尽可能多的孩子,并输出这个最大数值。
示例 1:
输入: g = [1,2,3], s = [1,1] 输出: 1 解释: 你有三个孩子和两块小饼干,3 个孩子的胃口值分别是:1,2,3。 虽然你有两块小饼干,由于他们的尺寸都是 1,你只能让胃口值是 1 的孩子满足。 所以你应该输出 1。
示例 2:
输入: g = [1,2], s = [1,2,3] 输出: 2 解释: 你有两个孩子和三块小饼干,2 个孩子的胃口值分别是 1,2。 你拥有的饼干数量和尺寸都足以让所有孩子满足。 所以你应该输出 2。
class Solution {
public int findContentChildren(int[] g, int[] s) {
// 对孩子的胃口和饼干的大小进行排序
Arrays.sort(g);
Arrays.sort(s);
int contentChildrenCount = 0; // 记录满足的孩子数量
int childIndex = 0; // 当前孩子的索引
int cookieIndex = 0; // 当前饼干的索引
// 遍历孩子和饼干,直到其中一个数组遍历完
while (childIndex < g.length && cookieIndex < s.length) {
// 如果当前饼干可以满足当前孩子的胃口
if (g[childIndex] <= s[cookieIndex]) {
contentChildrenCount++; // 满足一个孩子
childIndex++; // 移动到下一个孩子
}
// 无论饼干是否满足孩子,都要移动到下一个饼干
cookieIndex++;
}
return contentChildrenCount; // 返回满足的孩子数量
}
}