题目地址:
https://leetcode.com/problems/group-shifted-strings/
给定一个长
n
n
n的字符串数组
A
A
A,每个字符串只含英文小写字母。对于一个只含英文小写字母的字符串
s
s
s,可以将其每一个字母同时变成
26
26
26个字母中的后一个('z'
会变成'a'
)。如果某个字符串可以通过这样的操作成为另一个字符串,则它们等价。求所有等价类。
规定以'a'
开头的字符串是等价类的代表元,将每个字符串变为代表元就可以归类了。代码如下:
class Solution {
public:
vector<vector<string>> groupStrings(vector<string>& ss) {
unordered_map<string, vector<string>> mp;
for (auto& s : ss) {
auto t = s;
if (t[0] != 'a') {
int diff = t[0] - 'a';
for (int j = 0; j < t.size(); j++) {
t[j] -= diff;
if (t[j] < 'a') t[j] += 26;
}
}
mp[t].push_back(s);
}
vector<vector<string>> res;
for (auto& [k, v] : mp) res.push_back(v);
return res;
}
};
时空复杂度 O ( n l ) O(nl) O(nl)。