Design an algorithm to encode a list of strings to a string. The encoded string is then sent over the network and is decoded back to the original list of strings.
Machine 1 (sender) has the function:
string encode(vector<string> strs) { // ... your code return encoded_string; }
Machine 2 (receiver) has the function:
vector<string> decode(string s) { //... your code return strs; }
So Machine 1 does:
string encoded_string = encode(strs);
and Machine 2 does:
vector<string> strs2 = decode(encoded_string);
strs2
in Machine 2 should be the same as strs
in Machine 1.
Implement the encode
and decode
methods.
Note:
- The string may contain any possible characters out of 256 valid ascii characters. Your algorithm should be generalized enough to work on any possible characters.
- Do not use class member/global/static variables to store states. Your encode and decode algorithms should be stateless.
- Do not rely on any library method such as
eval
or serialize methods. You should implement your own encode/decode algorithm.
intuition: use a non-ASCII character as a delimiter to join the strings, such as Character.toString((char)257)
encode: time = O(n), space = O(1)
decode: time = O(n), space = O(n)
public class Codec { // Encodes a list of strings to a single string. public String encode(List<String> strs) { if(strs.size() == 0) { return Character.toString((char)258); } String d = Character.toString((char)257); StringBuilder sb = new StringBuilder(); for(String str : strs) { sb.append(str); sb.append(d); } sb.deleteCharAt(sb.length() - 1); return sb.toString(); } // Decodes a single string to a list of strings. public List<String> decode(String s) { String d = Character.toString((char)258); if(s.equals(d)) { return new ArrayList<>(); // empty string } d = Character.toString((char)257); // split(String regex, int limit), limit controls the number of times the pattern is applied and therefore affects the length of the resulting array. // If the limit n is greater than zero then the pattern will be applied at most n - 1 times, the array's length will be no greater than n, and the array's last entry will contain all input beyond the last matched delimiter. // If n is non-positive then the pattern will be applied as many times as possible and the array can have any length. // If n is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded. return Arrays.asList(s.split(d, -1)); } } // Your Codec object will be instantiated and called as such: // Codec codec = new Codec(); // codec.decode(codec.encode(strs));