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.
字符串的编码与解码。
请你设计一个算法,可以将一个 字符串列表 编码成为一个 字符串。这个编码后的字符串是可以通过网络进行高效传送的,并且可以在接收端被解码回原来的字符串列表。
思路如下,编码的时候,可以编成这样的格式:stringLength + "/" + string
这样解码的时候,可以通过找到第一个"/"的方式确定每个string的长度,也可以通过这个"/"的位置确定每个string的起始位置,哪怕string本身有"/"。
时间O(n)
空间O(n)
Java实现
1 public class Codec { 2 3 // Encodes a list of strings to a single string. 4 public String encode(List<String> strs) { 5 StringBuilder sb = new StringBuilder(); 6 for (String str : strs) { 7 // length + '/' + string 8 sb.append(str.length()).append('/').append(str); 9 } 10 return sb.toString(); 11 } 12 13 // Decodes a single string to a list of strings. 14 public List<String> decode(String s) { 15 List<String> res = new ArrayList<>(); 16 int i = 0; 17 while (i < s.length()) { 18 int slash = s.indexOf('/', i); 19 int size = Integer.valueOf(s.substring(i, slash)); 20 res.add(s.substring(slash + 1, slash + 1 + size)); 21 i = slash + 1 + size; 22 } 23 return res; 24 } 25 } 26 27 // Your Codec object will be instantiated and called as such: 28 // Codec codec = new Codec(); 29 // codec.decode(codec.encode(strs));
JavaScript实现
1 /** 2 * Encodes a list of strings to a single string. 3 * 4 * @param {string[]} strs 5 * @return {string} 6 */ 7 var encode = function (strs) { 8 let sb = []; 9 for (let str of strs) { 10 sb.push(str.length); 11 sb.push('/'); 12 sb.push(str); 13 } 14 return sb.join(''); 15 }; 16 17 /** 18 * Decodes a single string to a list of strings. 19 * 20 * @param {string} s 21 * @return {string[]} 22 */ 23 var decode = function (s) { 24 let res = []; 25 let i = 0; 26 while (i < s.length) { 27 let slash = s.indexOf('/', i); 28 let len = parseInt(s.substring(i, slash)); 29 let str = s.substring(slash + 1, slash + 1 + len); 30 res.push(str); 31 i = slash + 1 + len; 32 } 33 return res; 34 }; 35 36 /** 37 * Your functions will be called as such: 38 * decode(encode(strs)); 39 */
相关题目
271. Encode and Decode Strings
604. Design Compressed String Iterator
1313. Decompress Run-Length Encoded List