Problem

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.

Please implement encode and decode

Examples

Example1

Input: ["lint","code","love","you"]
Output: ["lint","code","love","you"]
Explanation:
One possible encode method is: "lint:;code:;love:;you"

Example2

Input: ["we", "say", ":", "yes"]
Output: ["we", "say", ":", "yes"]
Explanation:
One possible encode method is: "we:;say:;:::;yes"

Solution

There are multiple ways we can encode string. For eg. using special char like # to separate the strings while encoding. But the problem is what if the special char is part of string. Then it will be a problem.

What we can do is use special char like # but also append or prepend number of chars of string we have. For eg. we -> we#2.

Method 1 - Use Special Char and Length of Word

Code

Java
public class Codec {

	// Encodes a list of strings to a single string.
	public String encode(List<String> strs) {
		StringBuilder sb = new StringBuilder();

		for (String str: strs) {
			sb.append(str.length()).append('/').append(str);
		}

		return sb.toString();
	}

	// Decodes a single string to a list of strings.
	public List<String> decode(String s) {
		List<String> ans = new ArrayList<>();
		int i = 0;

		while (i < s.length()) {
			int slash = s.indexOf('/', i);
			int size = Integer.valueOf(s.substring(i, slash));
			ans.add(s.substring(slash + 1, slash + size + 1));
			i = slash + size + 1;
		}

	}
}
Python
    """  
    @param: strs: a list of strings  
    @return: encodes a list of strings to a single string.  
    """  
    def encode(self, strs):  
        res = ''  
        for s in strs:  
            encoded = str(len(s)) + '/' + s  
            res += encoded  
        return res    """  
    @param: str: A string  
    @return: dcodes a single string to a list of strings  
    """  
    def decode(self, str):  
        res, i = [], 0  
        while i < len(str):  
            # For example, 12/abc  
            e = i  
            while e < len(str) and str[e] != '/':  
                e += 1  
            size = int(str[i:e])  
            word = str[e + 1, e + 1 + size]  
            i = e + 1 + size  
            res.append(word)  
        return res