Encode and Decode Strings — Delimiter and Length-Prefix Schemes
Advertisement
Problem (LeetCode 271)
Design encode(strs) and decode(s) such that a list of strings can be serialized to a single string and back.
Approach 1 — Length-Prefix (Robust)
Format: [4-byte-length][string] for each string.
def encode(strs):
return ''.join(f'{len(s):04d}#{s}' for s in strs)
def decode(s):
strs, i = [], 0
while i < len(s):
length = int(s[i:i+4])
strs.append(s[i+5:i+5+length])
i += 5+length
return strs
Approach 2 — Escape Delimiter
Use : as delimiter, escape literal : as ::.
Solutions
Python
def encode(strs):
result = []
for s in strs:
result.append(str(len(s)) + '#' + s)
return ''.join(result)
def decode(s):
strs = []
i = 0
while i < len(s):
j = s.index('#', i)
length = int(s[i:j])
strs.append(s[j+1:j+1+length])
i = j+1+length
return strs
JavaScript
const encode=(strs)=>strs.map(s=>s.length+'#'+s).join('');
const decode=(s)=>{
const res=[]; let i=0;
while(i<s.length){const j=s.indexOf('#',i);const l=+s.slice(i,j);res.push(s.slice(j+1,j+1+l));i=j+1+l;}
return res;
};
Java
public String encode(List<String> strs){StringBuilder sb=new StringBuilder();for(String s:strs)sb.append(s.length()).append('#').append(s);return sb.toString();}
public List<String> decode(String s){List<String>res=new ArrayList<>();int i=0;while(i<s.length()){int j=s.indexOf('#',i);int l=Integer.parseInt(s.substring(i,j));res.add(s.substring(j+1,j+1+l));i=j+1+l;}return res;}
C++
#include <string>
#include <vector>
using namespace std;
string encode(vector<string>&v){string r;for(auto&s:v)r+=to_string(s.size())+'#'+s;return r;}
vector<string> decode(string s){vector<string>r;int i=0;while(i<(int)s.size()){int j=s.find('#',i);int l=stoi(s.substr(i,j-i));r.push_back(s.substr(j+1,l));i=j+1+l;}return r;}
C
/* C: write length as 4-byte int + string content, read back same way */
Advertisement