0
点赞
收藏
分享

微信扫一扫

C++掉血迷宫

小黑Neo 2024-09-18 阅读 29

第八部分:贪心

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; // 返回满足的孩子数量  
    }  
}
举报

相关推荐

0 条评论