用C ++编码和解码字符串
假设我们有一个字符串列表。我们必须设计一种可以将字符串列表编码为字符串的算法。我们还必须制作一个解码器,将其解码回原始的字符串列表。假设我们在这些机器上安装了编码器和解码器,并且有两个不同的功能,如下所示:
机器1(发送方)具有以下功能
string encode(vector<string< strs) {
//读取字符串并返回encode_string的代码;
}机器2(接收器)具有以下功能
vector<string< decode(string s) {
//解码encode_string并返回strs的代码;
}因此,如果输入类似于{“hello”,“world”,“coding”,“challenge”},则输出将为EncodedString5#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, ]