LeetCode 271. Encode and Decode Strings

来源:互联网 发布:mac地址查询软件 编辑:程序博客网 时间:2024/05/18 03:06

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.

s思路:
1. 怎么把vector< string> 变成string输出,然后再由string还原成vector< string>?
2. 统计每个string的长度,然后把长度放在string的开头,为了防止string开头包含数字,可以在长度后面加上一个空格或任意非数字字符分割!
3. 思考一下为什么上面这个做法可以?如何区分编码产生的新的冗余符号和原来的符号?显然,不能从内容上区分,必须从形式上区分,比如:根据位置。上面的方法就是,把string长度始终放在头部,即每一帧的头部,为了区分头部和内容,添加一个已知的符号,这样就可以确定找出帧头并根据帧头找到帧体!就是简单的通信知识应用!

class Codec {public:    // Encodes a list of strings to a single string.    string encode(vector<string>& strs) {        string res=" ";        for(auto str:strs){            res+=(to_string(str.size())+"+")+str;        }        return res;    }    // Decodes a single string to a list of strings.    vector<string> decode(string s) {        vector<string> res;        int i=0;        while(i<s.size()){            int len=0;            while(s[i]!='+'){                len=len*10+s[i++];//这里有个易忽略的bug,应该写成:len=len*10+s[i++]-'0';            }            i++;            res.push_back(s.substr(i,len));            i+=len;        }        return res;    }    //方法2:解码利用string的函数,比如:find()或者find_first_of()    vector<string> decode(string s) {        vector<string> res;        int i=0;        while(i<s.size()){            int addpos=s.find('+',i);            int len=stoi(s.substr(i,addpos-i));            res.push_back(s.substr(addpos+1,len));            i=addpos+len+1;        }        return res;    }};
0 0