用C ++编码和解码字符串

假设我们有一个字符串列表。我们必须设计一种可以将字符串列表编码为字符串的算法。我们还必须制作一个解码器,将其解码回原始的字符串列表。假设我们在这些机器上安装了编码器和解码器,并且有两个不同的功能,如下所示:

机器1(发送方)具有以下功能

string encode(vector<string< strs) {
   //读取字符串并返回encode_string的代码;
}

机器2(接收器)具有以下功能

vector<string< decode(string s) {
   //解码encode_string并返回strs的代码;
}

因此,如果输入类似于{“ hello”,“ world”,“ coding”,“ challenge”},则输出将为Encoded String 5#hello5#world6#coding9#challenge,解码形式为[hello,world,coding ,挑战,]

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个函数encode(),它将接受一个数组strs,

  • ret:=空字符串

  • 对于初始化i:= 0,当i <strs的大小时,更新(将i增加1),执行-

    • ret:= ret连接strs的大小[i]

  • 返回ret

  • 定义一个函数getNext(),它将使用x,start,s,

  • idx:= s的大小

  • 对于初始化i:=开始,当i <s的大小时,更新(将i增加1),执行-

    • idx:=我

    • 从循环中出来

    • 如果s [i]与x相同,则-

  • 返回idx

  • 定义方法解码将花费s

  • 定义数组ret

  • i:= 0

  • n:= s的大小

  • 当我<n时,-

    • hashPos:= getNext('#',i,s)

    • len:=(从索引(i到hashPos-i-1)的s的子字符串为整数

    • 我:= hashPos + 1

    • 在ret的末尾从索引(i到len-1)插入s的子字符串

    • 我:=我+伦

  • 返回ret

例 

让我们看下面的实现以更好地理解-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto< v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Codec {
public:
   string encode(vector<string>& strs) {
      string ret = "";
      for (int i = 0; i < strs.size(); i++) {
         ret += to_string(strs[i].size()) + "#" + strs[i];
      }
      return ret;
   }
   int getNext(char x, int start, string s){
      int idx = s.size();
      for (int i = start; i < s.size(); i++) {
         if (s[i] == x) {
            idx = i;
            break;
         }
      }
      return idx;
   }
   vector<string> decode(string s) {
      vector<string> ret;
      int i = 0;
      int n = s.size();
      while (i < n) {
         int hashPos = getNext('#', i, s);
         int len = stoi(s.substr(i, hashPos - i));
         i = hashPos + 1;
         ret.push_back(s.substr(i, len));
         i += len;
      }
      return ret;
   }
};
main(){
   Codec ob;
   vector<string> v = {"hello", "world", "coding", "challenge"};
   string enc = (ob.encode(v));
   cout << "Encoded String " << enc << endl;
   print_vector(ob.decode(enc));
}

输入项

{"hello", "world", "coding", "challenge"}

输出结果

Encoded String 5#hello5#world6#coding9#challenge
[hello, world, coding, challenge, ]