当前位置:首页 > 力扣 > LeetCode 2309题解:寻找字符串中的最大字母(哈希表+字符转换)

LeetCode 2309题解:寻找字符串中的最大字母(哈希表+字符转换)

2个月前 (07-27)

LeetCode 2309题解:寻找字符串中的最大字母(哈希表+字符转换) 哈希表 字符转换 力扣题解 第1张

一、题目解读

LeetCode 2309题要求在一个仅含小写和/或大写英文字母的字符串中,找出满足以下条件的最大字母:该字母的大写和小写形式均出现在字符串中。例如,若输入 "aAbBcC",则输出 "C"(大写 "C" 和小写 "c" 均存在)。题目难点在于高效判断字符对的存在性,并找到最大值。

二、解题思路

采用“哈希表+字符转换”策略:

1. 使用无序集合(unordered_set<char> seen)存储所有出现过的字符,避免重复遍历。

2. 遍历字符串时,针对每个字符:

○ 若为大写,检查其对应小写字母是否在集合中;

○ 若为小写,检查大写字母是否存在。

3. 若字符对存在且当前字符大于当前最佳字母,则更新最佳字母。

4. 最终返回最佳字母的大写形式(若为空则返回空字符串)。

三、解题步骤

1. 初始化:

○ 创建哈希集合 seen 存储字符,初始化最佳字母 best 为空字符('\0')。

2. 遍历字符串,对每个字符 c,加入 seen 集合(seen.insert(c))。

    若 c 为大写:

        转换小写 lower = tolower(c),检查 lower 是否在 seen 中。

        若存在且 c > best,更新 best。

    若 c 为小写:

        转换大写 upper = toupper(c),检查 upper 是否在 seen 中。

        若存在且 upper > best,更新 best。

3. 结果处理:

○ 若 best 为空,返回空字符串;否则将 best 转换为单字符字符串返回。

四、代码及注释

class Solution {
public:
    string greateSTLetter(string s) {
        unordered_set<char> seen;  // 存储所有出现过的字符
        char best = '\0';          // 初始化最佳字母为空字符
        
        // 遍历字符串中的每个字符
        for (char c : s) {
            seen.insert(c);        // 将当前字符加入集合
            
            // 检查当前字符的大写和小写形式是否都在集合中
            if (isupper(c)) {      // 若为大写
                char lower = tolower(c);
                if (seen.count(lower) && c > best) {
                    best = c;      // 更新最佳字母
                }
            } else {              // 若为小写
                char upper = toupper(c);
                if (seen.count(upper) && upper > best) {
                    best = upper;  // 更新最佳字母
                }
            }
        }
        
        // 若找到了最佳字母,返回其大写形式,否则返回空字符串
        return best == '\0'? "" : string(1, best);
    }
};

五、总结

本解法通过哈希表高效记录字符出现情况,结合字符转换判断配对关系,时间复杂度为 O(n),空间复杂度为 O(|Σ|)(Σ为字符集,实际为26个字母)。关键点包括:

1. 利用哈希集合减少重复查找;

2. 通过 isupper() 与 tolower()/toupper() 函数灵活处理大小写转换;

3. 边遍历边更新最佳字母,无需额外排序或遍历比较。

算法简洁高效,适用于字符配对查找与最值求解场景,是处理字符串中字符关系问题的典型思路。


原创内容 转载请注明出处

分享给朋友:

相关文章

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

【洛谷1184题解析】用C++高效解决地点匹配问题(附代码与解题思路)

一、题目解读洛谷1184题要求处理一组地点列表与行程记录,统计其中匹配的天数。题目难点在于高效处理带有空格的字符串输入,以及快速判断每日行程是否在高手可去地点集合中。需要兼顾输入格式解析与算法效率。二...

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

一、题目解读力扣2846题要求解决一个基于图连通性的操作优化问题。给定一个无向图,包含边权重,以及一系列查询,每个查询询问两点间路径的最小操作次数。题目关键在于高效计算路径上权重分布的统计信息,并转化...

LeetCode 2778题解:平方和的高效计算与因数遍历优化(C++实现)

LeetCode 2778题解:平方和的高效计算与因数遍历优化(C++实现)

一、题目解读LeetCode 2778题要求计算数组中下标为n的因数的元素的平方和。例如,若n=6,其因数为1、2、3、6,则需计算nums[0]、nums[1]、nums[2]、nums[5]的平方...

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

一、题目解读力扣面试题02.05要求将两个链表表示的整数相加,每个节点存储一位数字(逆序),结果同样以链表形式返回。例如,链表1为7→2→4,链表2为5→6→3,相加结果应为2→9→8→7。题目难点在...

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

一、题目解读力扣LCR074题要求对给定的二维区间数组(每个区间由起始点和终止点构成)进行合并,将重叠的区间合并为更宽的区间,最终输出不重叠的合并结果。例如,输入[[1,3],[2,6],[8,10]...

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

一、题目解读LeetCode 1031题要求在不重叠的前提下,从给定数组nums中寻找两个长度分别为firstLen和secondLen的连续子数组,使其和最大。题目强调子数组必须不重叠,即两个子数组...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。