Computer >> Máy Tính >  >> Lập trình >> C ++

Mã hóa và giải mã chuỗi trong C ++

Giả sử chúng ta có một danh sách các chuỗi. Chúng ta phải thiết kế một thuật toán có thể mã hóa danh sách các chuỗi thành một chuỗi. Chúng tôi cũng phải tạo một bộ giải mã sẽ giải mã trở lại danh sách chuỗi ban đầu. Giả sử chúng ta đã cài đặt bộ mã hóa và bộ giải mã trên các máy này và có hai chức năng khác nhau như sau -

Máy 1 (người gửi) có chức năng

string encode(vector<string< strs) {
   //code to read strings and return encoded_string;
}

Máy 2 (máy thu) có chức năng

vector<string< decode(string s) {
   //code to decode encoded_string and returns strs;
}

Vì vậy, nếu đầu vào là {"hello", "world", "coding", "challenge"}, thì đầu ra sẽ là Chuỗi mã hóa 5 # hello5 # world6 # coding9 # challenge, dạng đã giải mã [hello, world, coding , thách thức,]

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một mã hóa hàm (), điều này sẽ lấy một chuỗi mảng,

  • ret:=chuỗi trống

  • để khởi tạo i:=0, khi tôi

    • ret:=ret nối kích thước của strs [i]

  • trả lại ret

  • Xác định một hàm getNext (), hàm này sẽ lấy x, start, s,

  • idx:=kích thước của s

  • để khởi tạo i:=start, khi i

    • nếu s [i] giống với x thì -

      • idx:=i

      • Ra khỏi vòng lặp

  • trả về idx

  • Xác định phương pháp giải mã điều này sẽ mất s

  • Xác định ret mảng

  • i:=0

  • n:=kích thước của s

  • trong khi tôi

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

    • len:=(chuỗi con của s từ chỉ mục (i đến hashPos - i - 1) dưới dạng số nguyên

    • i:=hashPos + 1

    • chèn chuỗi con của s từ chỉ mục (i đến len - 1) vào cuối ret

    • i:=i + len

  • trả lại ret

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau đây để hiểu rõ hơn -

#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));
}

Đầu vào

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

Đầu ra

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