LeetCode 271. Encode and Decode Strings

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值