zoukankan      html  css  js  c++  java
  • leetcode271- 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.

    本题难度不在对字符加密,而在怎么把各个字符串分开。本来字符已经占用了任意可用的256种了,所以你不能简单地选一个分隔符然后用split。
     
    法1. 加密时用 长度+'#'+真正字符串的形式去加(实践真的可行,哪怕实际有分隔符的字符,因为你说明了长度了你把它取出来后下一个使用indexOf就不会影响了。而且第一个分隔符肯定来自于真正的分隔符,所以递推下去就都不会有问题了)。
    解密时每次 1.indexOf('#', idx),从指针所指的位置开始找第一个分隔符。2.上个指针到当前分割点语意理解后就是字符串长度。3.后面取出字符串即可。
     
    法2. 参考ascii字符\ 转义字符的区别方法,用两个字符合在一起表示分隔符。”:;”为分隔符,并且对原字符串里所有的’:'字符做转换,变为”::”。这样就能明确地知道,序列化后字符串里遇到一个’:’,到底是分隔符的’:’呢,还是普通文本的’:’呢。(还是担心不保险可以跑一跑ab: cd, ab:; cd,都没问题的因为就算原来有:;也会被改成::;,而decode的时候看到:会先把后面的:一起吃掉,就只剩下;了,不会触发分隔。)
    encode时:看到’:’转为”::”,看到结尾加个”:;”
    decode时:看到’:’看下一个,若是’:’只加一个并且跳一格,若是’;’加入ans清空sb
    细节:清空sb可以delete(0, length())或者赋值新的sb,并不自带clear()方法。 

    法1:

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

    法2:

    public class Codec {
    
        // Encodes a list of strings to a single string.
        public String encode(List<String> strs) {
            StringBuilder sb = new StringBuilder();
            for (String str : strs) {
                for (char c : str.toCharArray()) {
                    if (c == ':') {
                        sb.append("::");
                    } else {
                        sb.append(c);
                    }
                }
                sb.append(":;");
            }
            return sb.toString();
        }
    
        // Decodes a single string to a list of strings.
        public List<String> decode(String s) {
            List<String> ans = new ArrayList<>();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < s.length(); i++) {
                if (s.charAt(i) != ':') {
                    sb.append(s.charAt(i));
                } else if (i + 1 < s.length() && s.charAt(i + 1) == ':') {
                    sb.append(':');
                    i++;
                } else {
                    ans.add(sb.toString());
                    sb.delete(0, sb.length());
                    i++;
                }
            }
            return ans;
        }
    }
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec = new Codec();
    // codec.decode(codec.encode(strs));
  • 相关阅读:
    Beta冲刺 (6/7)
    Beta冲刺(5/7)
    Beta 冲刺 (4/7)
    Beta 冲刺 (3/7)
    软件产品案例分析(团队)
    Beta 冲刺 (2/7)
    Beta 冲刺 (1/7)
    java 常用设计模式及Spring中应用了哪些设计模式
    java 八大排序算法
    记录java学习计划及相关工作中用到的技术/工具
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/7965947.html
Copyright © 2011-2022 走看看