在C ++中将移位的字符串分组

假设我们有一个字符串,我们可以将其每个字母“移动”到其连续字母,因此:“ 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, ],]