leetcode——第249题——移位字符串分组

本文介绍了一种针对字符串列表的算法,通过“移位”操作将字符串转换为以'a'开头的形式,并利用哈希映射进行分组。具体实现包括两次字符串映射过程:第一次映射将字符串转换为统一形式;第二次映射则基于转换后的形式进行分组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
给定一个字符串,对该字符串可以进行 “移位” 的操作,也就是将字符串中每个字母都变为其在字母表中后续的字母,比如:“abc” -> “bcd”。这样,我们可以持续进行 “移位” 操作,从而生成如下移位序列:
“abc” -> “bcd” -> … -> “xyz”
给定一个包含仅小写字母字符串的列表,将该列表中所有满足 “移位” 操作规律的组合进行分组并返回。

示例:
输入:[“abc”, “bcd”, “acef”, “xyz”, “az”, “ba”, “a”, “z”]
输出:
[
[“abc”,“bcd”,“xyz”],
[“az”,“ba”],
[“acef”],
[“a”,“z”]
]
解释:可以认为字母表首尾相接,所以 ‘z’ 的后续为 ‘a’,所以 [“az”,“ba”] 也满足 “移位” 操作规律。

/*
字符串需要重构的过程,所谓重构就是把 bcd 转为 abc,也就是映射为 以a开头的字符串

两个映射过程
1、第一个映射:将原始的字符串 prestr 映射为以a开头的字符串 str,注意str的顺序已经发生了异位
    ch = (ch - prestr[0] + 26) % 26 + 'a';
2、第二个映射:哈希映射,将映射后的字符串 str 作为哈希的 key,原始的字符串 prestr 作为 value,组成对
    mp[str].push_back(prestr);

最后的结果输出,需要遍历哈希映射,将对应的value值输出即可
*/
class Solution {
public:
    vector<vector<string>> groupStrings(vector<string>& strings) 
    {
        vector<vector<string>> res;
        // key存放的是每个 str 映射到以a开头的字符串后的 字符串, velue 是原始的字符串
        unordered_map<string, vector<string>> mp;  
        for (string& prestr : strings)
        {
            string str(prestr);
            // 对于这个公式 ch - prestr[0]  注意这里的是减去 不改动的字符串对应的第一个字符
            // 整题的亮点和精髓在这句  ch = (ch - prestr[0] + 26) % 26 + 'a'  将每个str映射为以 a开头的字符串,作为哈希的key
            for (char& ch : str)     ch = (ch - prestr[0] + 26) % 26 + 'a';
            mp[str].push_back(prestr);
        }
        for (auto it : mp)  res.push_back(it.second);
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值