假设我们有一个字符串,我们可以将其每个字母“移动”到其连续字母,因此:“ abc”可以更改为“ bcd”。我们可以继续执行此操作,形成以下序列:“ abc”->“ bcd”-> ...->“ xyz”。如果我们有一个仅包含小写字母的非空字符串列表,则必须对属于同一移位序列的所有字符串进行分组。
因此,如果输入类似于[“ abc”,“ bcd”,“ acef”,“ xyz”,“ az”,“ ba”,“ a”,“ z”],则输出将为[[“ abc “,” bcd“,” xyz“],[” az“,” ba“],[” acef“],[” a“,” z“]]
为了解决这个问题,我们将遵循以下步骤-
定义一张映射
定义一个2D阵列ret
对于初始化i:= 0,当i <字符串大小时,更新(将i增加1),执行-
diff:=字符串[i,j]-字符串[i,j-1]
如果diff <0,则-
key:= key连接“#”连接diff作为字符串
差异:=差异+ 26
键:=空字符串
对于初始化j:= 1,当j <字符串[i]的大小时,更新(将j增加1),执行-
在m [key]的末尾插入字符串[i]
对于m中的每个元素,执行-
在ret的末尾插入它的值
(增加1)
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; void print_vector(vector<vector<auto< > v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << "["; for(int j = 0; j <v[i].size(); j++){ cout << v[i][j] << ", "; } cout << "],"; } cout << "]"<<endl; } class Solution { public: vector<vector<string>> groupStrings(vector<string<& strings) { unordered_map<string, vector<string> > m; vector<vector<string< > ret; for (int i = 0; i < strings.size(); i++) { string key = ""; for (int j = 1; j < strings[i].size(); j++) { int diff = strings[i][j] - strings[i][j - 1]; if (diff < 0) diff += 26; key += "#" + to_string(diff); } m[key].push_back(strings[i]); } unordered_map<string, vector<string< >::iterator it = m.begin(); while (it != m.end()) { ret.push_back(it->second); it++; } return ret; } }; main(){ Solution ob; vector<string< v = {"abc","bcd","acef","xyz","az","ba","a","z"}; print_vector(ob.groupStrings(v)); }
{"abc","bcd","acef","xyz","az","ba","a","z"}
输出结果
[[az, ba, ],[a, z, ],[abc, bcd, xyz, ],[acef, ],]