题目地址:
https://www.lintcode.com/problem/encode-and-decode-strings/description
实现对字符串数组的序列化和反序列化的功能。
容易想到的一个序列化方法是设置分隔符,将字符串之间分隔出来。但问题在于,如果处理字符串本身就有分隔符的情况。我们可以模仿很多编程语言中的字符转义的方法,例如\
这个字符,要写成\\
,类似这样。我们可以强行规定:;
是分隔符,遇到:
自己,就写成::
,遇到别的字符,则直接append。代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
/*
* @param strs: a list of strings
* @return: encodes a list of strings to a single string.
*/
public String encode(List<String> strs) {
// write your code here
StringBuilder sb = new StringBuilder();
for (String str : strs) {
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
// 遇到:,则进行转义
if (ch == ':') {
sb.append("::");
} else {
sb.append(ch);
}
}
// 遍历完一个字符串,就append上分隔符
sb.append(":;");
}
return sb.toString();
}
/*
* @param str: A string
* @return: dcodes a single string to a list of strings
*/
public List<String> decode(String str) {
// write your code here
List<String> res = new ArrayList<>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch == ':') {
if (str.charAt(i + 1) == ';') {
res.add(sb.toString());
// 别忘了重置sb
sb.setLength(0);
i++;
} else {
sb.append(str.charAt(i + 1));
i++;
}
} else {
sb.append(ch);
}
}
return res;
}
}
时空复杂度 O ( n ) O(n) O(n)。