• [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.

    给字符加码再解码,先有码再无码,题目没有限制加码的方法,那么只要能成功的把有码变成无码就行了,具体变换方法自己设计。

    Java:

    public String encode(List<String> strs) {
        StringBuffer out = new StringBuffer();
        for (String s : strs)
            out.append(s.replace("#", "##")).append(" # ");
        return out.toString();
    }
    
    public List<String> decode(String s) {
        List strs = new ArrayList();
        String[] array = s.split(" # ", -1);
        for (int i=0; i<array.length-1; ++i)
            strs.add(array[i].replace("##", "#"));
        return strs;
    }
    

    Java: with streaming

    public String encode(List<String> strs) {
        return strs.stream()
                   .map(s -> s.replace("#", "##") + " # ")
                   .collect(Collectors.joining());
    }
    
    public List<String> decode(String s) {
        List strs = Stream.of(s.split(" # ", -1))
                          .map(t -> t.replace("##", "#"))
                          .collect(Collectors.toList());
        strs.remove(strs.size() - 1);
        return strs;
    } 

    Java:

    // Encodes a list of strings to a single string.
        public String encode(List<String> strs) {
            StringBuilder output = new StringBuilder();
            for(String str : strs){
                // 对于每个子串,先把其长度放在前面,用#隔开
                output.append(String.valueOf(str.length())+"#");
                // 再把子串本身放在后面
                output.append(str);
            }
            return output.toString();
        }
    
        // Decodes a single string to a list of strings.
        public List<String> decode(String s) {
            List<String> res = new LinkedList<String>();
            int start = 0;
            while(start < s.length()){
                // 找到从start开始的第一个#,这个#前面是长度
                int idx = s.indexOf('#', start);
                int size = Integer.parseInt(s.substring(start, idx));
                // 根据这个长度截取子串
                res.add(s.substring(idx + 1, idx + size + 1));
                // 更新start为子串后面一个位置
                start = idx + size + 1;
            }
            return res;
        }
    

    Java: better

    public String encode(List<String> strs) {
        StringBuffer result = new StringBuffer();
    
        if(strs == null || strs.size() == 0)
            return result.toString();
    
        for(String str: strs){
            result.append(str.length());
            result.append("#");
            result.append(str);
        }
    
        return result.toString();
    }
    
    // Decodes a single string to a list of strings.
    public List<String> decode(String s) {
        List<String> result = new ArrayList();
    
        if(s == null || s.length() == 0)
            return result;
    
        int current = 0;
        while(true){
            if(current == s.length())
                break;
            StringBuffer sb = new StringBuffer();
            while(s.charAt(current) != '#'){
                sb.append(s.charAt(current));
                current++;
            }
            int len = Integer.parseInt(sb.toString());
            int end = current + 1 + len;
            result.add(s.substring(current+1, end));
            current = end;
        }
        return result;
    } 

    Java: Time Complexity - O(n), Space Complexity - O(1)

    public class Codec {
    
        // Encodes a list of strings to a single string.
        public String encode(List<String> strs) {
            if(strs == null || strs.size() == 0) {
                return "";
            }
            StringBuilder sb = new StringBuilder();
            for(String s : strs) {
                int len = s.length();
                sb.append(len);
                sb.append('/');
                sb.append(s);
            }
            return sb.toString();
        }
    
        // Decodes a single string to a list of strings.
        public List<String> decode(String s) {
            List<String> res = new ArrayList<>();
            if(s == null ||s.length() == 0) {
                return res;
            }
            int index = 0;
            while(index < s.length()) {
                int forwardSlashIndex = s.indexOf('/', index);
                int len = Integer.parseInt(s.substring(index, forwardSlashIndex));
                res.add(s.substring(forwardSlashIndex + 1, forwardSlashIndex + 1 + len));
                index = forwardSlashIndex + 1 + len;
            }
            return res;
        }
    }
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec = new Codec();
    // codec.decode(codec.encode(strs));  

    Java: Time Complexity - O(n), Space Complexity - O(n)

    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> res = new ArrayList<>();
            if (s == null || s.length() == 0) return res;
            for (int lo = 0, i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (c == '#') {
                    int len = Integer.parseInt(s.substring(lo, i));
                    res.add(s.substring(i + 1, i + 1 + len));
                    lo = i + 1 + len;
                    i = i + 1 + len;
                }
            }
            return res;
        }
    }
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec = new Codec();
    // codec.decode(codec.encode(strs));
    

    Python:

    # Time:  O(n)
    # Space: O(1)
    class Codec:
        def encode(self, strs):
            """Encodes a list of strings to a single string.
            :type strs: List[str]
            :rtype: str
            """
            encoded_str = ""
            for s in strs:
                encoded_str += "%0*x" % (8, len(s)) + s
            return encoded_str
    
    
        def decode(self, s):
            """Decodes a single string to a list of strings.
            :type s: str
            :rtype: List[str]
            """
            i = 0
            strs = []
            while i < len(s):
                l = int(s[i:i+8], 16)
                strs.append(s[i+8:i+8+l])
                i += 8+l
            return strs

    C++:

    class Codec {
    public:
        // Encodes a list of strings to a single string.
        string encode(vector<string>& strs) {
            string res = "";
            for (auto a : strs) {
                res.append(to_string(a.size())).append("/").append(a);
            }
            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()) {
                auto found = s.find("/", i);
                int len = atoi(s.substr(i, found).c_str());
                res.push_back(s.substr(found + 1, len));
                i = found + len + 1;
            }
            return res;
        }
    };
    

    C++:

    class Codec {
    public:
        // Encodes a list of strings to a single string.
        string encode(vector<string>& strs) {
            string res = "";
            for (auto a : strs) {
                res.append(to_string(a.size())).append("/").append(a);
            }
            return res;
        }
        // Decodes a single string to a list of strings.
        vector<string> decode(string s) {
            vector<string> res;
            while (!s.empty()) {
                int found = s.find("/");
                int len = atoi(s.substr(0, found).c_str());
                s = s.substr(found + 1);
                res.push_back(s.substr(0, len));
                s = s.substr(len);
            }
            return res;
        }
    };
    

      

      

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    C++程序设计基础(7)位运算
    C++程序设计基础(1)程序的编译和执行
    深度学习看过的文档留存
    Linux常用快捷键
    从Zero到Hero,一文掌握Python关键代码
    三角测量原理与双目视觉景深恢复
    动态规划——DP算法(Dynamic Programing)
    算法-动态规划 Dynamic Programming--从菜鸟到老鸟
    语义分割--全卷积网络FCN详解
    2014-VGG-《Very deep convolutional networks for large-scale image recognition》翻译
  • 原文地址:https://www.cnblogs.com/lightwindy/p/9758222.html
Copyright © 2020-2023  润新知