271. Encode and Decode Strings
Medium
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | //C++: 92ms typedef unsigned char uchar; class Codec { public: // Encodes a list of strings to a single string. string encode(vector<string>& strs) { string ret; for(auto s:strs){ int i = 0, len = s.size(), cnt; while(i<len){ cnt = 1; uchar c = s[i++]; while(i<len && (uchar)s[i]==c && cnt<254){ i++; cnt++; } ret += (uchar)cnt; ret += c; } ret += (uchar)255; } return ret; } // Decodes a single string to a list of strings. vector<string> decode(string s) { vector<string> ret; string cur; int i=0, len = s.size(); while(i<len){ uchar c = s[i++]; if(c==(uchar)255){ ret.push_back(cur); cur.clear(); }else{ int cnt = c; c = s[i++]; for(int i=0; i<cnt; ++i) cur += c; } } return ret; } }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class Codec { // Encodes a list of strings to a single string. public String encode(List<String> strs) { StringBuilder sb = new StringBuilder(); for(String s : strs) { sb.append(s.length()).append('/').append(s); } return sb.toString(); } // Decodes a single string to a list of strings. public List<String> decode(String s) { List<String> ret = new ArrayList<String>(); int i = 0; while(i < s.length()) { int slash = s.indexOf('/', i); int size = Integer.valueOf(s.substring(i, slash)); i = slash + size + 1; ret.add(s.substring(slash + 1, i)); } return ret; } } // Your Codec object will be instantiated and called as such: // Codec codec = new Codec(); // codec.decode(codec.encode(strs)); |
No comments:
Post a Comment