LeetCode 249. Group Shifted Strings

本文介绍了一种高效算法,用于将一系列字符串按其“移位”特性进行分组。通过计算每组字符串中字母间的相对位置差值来形成独特的模式,并利用哈希表快速查找和分组,最终达到O(n)的时间复杂度。

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

Given a string, we can “shift” each of its letter to its successive letter, for example: “abc” -> “bcd”. We can keep “shifting” which forms the sequence:

“abc” -> “bcd” -> … -> “xyz”
Given a list of strings which contains only lowercase alphabets, group all strings that belong to the same shifting sequence.

For example, given: [“abc”, “bcd”, “acef”, “xyz”, “az”, “ba”, “a”, “z”],
Return:

[
[“abc”,”bcd”,”xyz”],
[“az”,”ba”],
[“acef”],
[“a”,”z”]
]
Note: For the return value, each inner list’s elements must follow the lexicographic order.

思路:
1. 放到一组的string遵循一个pattern,我们可以遍历所有string,把每个string的相邻字母的差值作为pattern,例如:“abc”的pattern就是“11”,然后把这个pattern保存在hashtable中;当遇到“bcd”,先计算pattern为”11”,然后查询hash表,如果存在,就把”bcd”存在unordered_map
2. 注意的是,”al”的pattern也是”11”,为了区分这两者,需要添加逗号分隔,即:”abc”pattern=”1,1”,”al”的pattern=”11”。
3. 这题需要提取和保存的信息是:每个string的pattern。
4. 刚拿到题,我的思路是:每个string和所有string比较,这样复杂度就是o(n^2),而用提取pattern并用hash保存,复杂度可降低o(n)

vector<vector<string>> groupStrings(vector<string>& strings) {
    unordered_map<string,vector<string>> mm;

    for(auto&cur:strings){
        string pattern=" ";
        for(auto&k:cur)
            pattern= pattern+to_string(((k-cur[0])+26)%26)+',';
        mm[pattern].push_back(cur); 
    }
    vector<vector<string>> res;
    for(auto it:mm){
        vector<string> vect=it.second;
        sort(vect.begin(),vect.end());
        res.push_back(vect);
    }
    return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值