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.
strs[i] contains any possible characters out of 256 valid ASCII characters.
Follow up: Could you write a generalized algorithm to work on any possible set of characters?
ac
public class Codec {
// Encodes a list of strings to a single string.
public String encode(List<String> strs) {
StringBuilder sb = new StringBuilder();
sb.append(strs.size() + "/");
for (String s : strs) {
sb.append(s.length() + "/");
}
for (String s : strs) {
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<String>();
StringBuilder sb = new StringBuilder();
int stringCnt = -1;
List<Integer> strLens = new ArrayList<Integer>();
int lenCnt = 0;
int i = 0;
for (; i < s.length(); i++) {
if (s.charAt(i) == '/') {
int num = Integer.parseInt(sb.toString());
sb.setLength(0);
if (stringCnt == -1) {
stringCnt = num;
} else if (lenCnt < stringCnt) {
strLens.add(num);
lenCnt++;
if (lenCnt == stringCnt) break;
}
continue;
}
sb.append(s.charAt(i));
}
i++;
// cut strings
for (int len : strLens) {
res.add(s.substring(i, i+len));
i += len;
}
return res;
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.decode(codec.encode(strs));