Encode and Decode Strings 解答

Question

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.

Solution 1 -- JSON format

第一种方法是参考的JSON的规则。

Encode: 我们将输入的字符串数组封装成JSON中的array。[ (left bracket) and ] (right bracket) 表示开头的结尾。中间的分隔用, (comma)。然后对于每个字符串,是 wrapped in double quotes。

由于字符串中本来就可能有双引号或是back slash (\),所以我们需要对这两种符号做转义。方法是多加一个back slash

如 原字符串 \"aafg"  -> \\\"aafg\"

JSON里还有更复杂的字符串处理方法。但我们这里的目标只是让encode,再decode后的字符串相同,所以不必那么复杂。

Decode处理原则如下

1. 一个boolean的variable记录当前应该是下一个字符串的开头还是当前字符串的结束

2. 碰到bracket,根据是开始/结束,新建一个空字符串/将当前的字符串存入结果中

3. 碰到back slash,看它下一个元素是否是back slash / bracket,如果是,则将它下一个元素加到字符串中,计数加一。

 1 public class Codec {
 2     private final char start = ‘[‘;
 3     private final char end = ‘]‘;
 4     private final char include = ‘"‘;
 5     private final char strSplit = ‘,‘;
 6
 7     // Encodes a list of strings to a single string.
 8     public String encode(List<String> strs) {
 9         StringBuilder sb = new StringBuilder();
10         sb.append(start);
11         for (String str : strs) {
12             sb.append(include);
13             int len = str.length();
14             for (int i = 0; i < len; i++) {
15                 char current = str.charAt(i);
16                 if (current == ‘"‘ || current == ‘\\‘) {
17                     sb.append(‘\\‘);
18                 }
19                 sb.append(current);
20             }
21             sb.append(include);
22             sb.append(strSplit);
23         }
24         sb.append(end);
25         return sb.toString();
26     }
27
28     // Decodes a single string to a list of strings.
29     public List<String> decode(String s) {
30         List<String> result = new ArrayList<String>();
31         if (s == null || s.length() < 1) {
32             return result;
33         }
34         int len = s.length();
35         if (s.charAt(0) != start || s.charAt(len - 1) != end) {
36             return result;
37         }
38         boolean startSymbol = true;
39         StringBuilder sb = new StringBuilder();
40         for (int i = 1; i < len - 1; i++) {
41             char current = s.charAt(i);
42             if (current == include) {
43                 if (startSymbol) {
44                     sb = new StringBuilder();
45                 } else {
46                     result.add(sb.toString());
47                 }
48                 startSymbol = !startSymbol;
49                 continue;
50             }
51             if (current == strSplit && startSymbol) {
52                 continue;
53             }
54             if (current == ‘\\‘) {
55                 char next = s.charAt(i + 1);
56                 if (next == ‘\\‘ || next == ‘"‘) {
57                     sb.append(next);
58                     i++;
59                     continue;
60                 }
61             }
62             sb.append(current);
63         }
64         return result;
65     }
66 }
67
68 // Your Codec object will be instantiated and called as such:
69 // Codec codec = new Codec();
70 // codec.decode(codec.encode(strs));

Solution 2

利用了Java里String的 int indexOf(int ch, int fromIndex)函数。

同时存入字符串和字符串的长度。

 1 public class Codec {
 2
 3     // Encodes a list of strings to a single string.
 4     public String encode(List<String> strs) {
 5         StringBuilder sb = new StringBuilder();
 6         for (String str : strs) {
 7             sb.append(str.length()).append(‘/‘).append(str);
 8         }
 9         return sb.toString();
10     }
11
12     // Decodes a single string to a list of strings.
13     public List<String> decode(String s) {
14         List<String> result = new ArrayList<String>();
15         int length = s.length();
16         int i = 0;
17         while (i < length) {
18             int slash = s.indexOf(‘/‘, i);
19             int size = Integer.valueOf(s.substring(i, slash));
20             result.add(s.substring(slash + 1, slash + size + 1));
21             i = slash + size + 1;
22         }
23         return result;
24     }
25 }
时间: 2024-08-09 10:29:34

Encode and Decode Strings 解答的相关文章

271. Encode and Decode Strings

/* * 271. Encode and Decode Strings * 2016-6-25 by Mingyang * 这道题很酷的地方就是选择一种存储方式可以有效地存储string,我一开始就想到了存长度加string的方法 * 这个题用了一个indexof的API, * public int indexOf(String str,int fromIndex) * Returns the index within this string of the first occurrence of

[LeetCode#271] Encode and Decode Strings

Problem: 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) { //

Encode and Decode Strings -- LeetCode

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

LeetCode &quot;Encode and Decode Strings&quot;

This is about https://en.wikipedia.org/wiki/Run-length_encoding. The trick is, for a valid char, we only compress up to 254 occurences - count 255 means end of a string. typedef unsigned char UCHAR; class Codec { const static int MAX_CNT = 255; publi

iOS 7: Base64 Encode and Decode NSData and NSString Objects

iOS 7: Base64 Encode and Decode NSData and NSString Objects FRI, JAN 24 CORE SERVICES TWEET With the release of iOS 7, Apple added support for encoding and decoding data using Base64. In this post we will walk through two examples using Base64 to enc

python的str,unicode对象的encode和decode方法

python的str,unicode对象的encode和decode方法 python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byte[]. 而python中的unicode对象应该才是等同于java中的String对象,或本质上是java的char[]. 对于 s="你好" u=u"你好" s="你好" u=u"你好" 1. s.decode方法和u.enc

Python之encode与decode浅析

 Python之encode与decode浅析 在 python 源代码文件中,如果你有用到非ASCII字符,则需要在文件头部进行字符编码的声明,声明如下: # code: UTF-8 因为python 只检查 #.coding 和编码字符串,为了美观等原因可以如下写法: #-*-coding:utf-8-*- 常见编码介绍: GB2312编码:适用于汉字处理.汉字通信等系统之间的信息交换. GBK编码:是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码.

JAVA 字符串题目 以静态方法实现encode()和decode()的调用

题目: 用java语言实现两个函数encode()和decode(),分别实现对字符串的变换和复原.变换函数encode()顺序考察已知字符串的字符,按以下规则逐组生成新字符串: (1)若已知字符串的当前字符不是大于0的数字字符,则复制该字符于新字符串中: (2)若已知字符串的当前字符是一个数字字符,且它之后没有后继字符,则简单地将它复制到新字符串中: (3)若已知字符串的当前字符是一个大于0的数字字符,并且还有后继字符,设该数字字符的面值为n,则将它的后继字符(包括后继字符是一个数字字符)重复

java Base64 [ Encode And Decode In Base64 Using Java ]

http://www.javatips.net/blog/2011/08/how-to-encode-and-decode-in-base64-using-java http://commons.apache.org/proper/commons-codec/ 官方下载链接 Encode And Decode In Base64 Using Java explains about different techniques for Encode Base64 using java / Decode