# 271.Encode and Decode Strings

[Link](https://medium.com/leetcode-%E6%BC%94%E7%AE%97%E6%B3%95%E6%95%99%E5%AD%B8/024-leetcode-271-%E6%BC%94%E7%AE%97%E6%B3%95-encode-and-decode-strings-%E5%AD%97%E4%B8%B2%E5%8A%A0%E8%A7%A3%E5%AF%86-722cafd6238)

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**

```
     public String encode(List<String> strs) {
        StringBuilder sb = new StringBuilder();
        for (String str : strs
        ) {
            sb.append(str.length() + "#" + str);
        }
        return sb.toString();
    }

    // Decodes a single string to a list of strings.
    public List<String> decode(String s) {
        List<String> ret = new ArrayList<>();
        int endIndex = 0;
        int signIndex = 0;

        while (endIndex < s.length()) {
            signIndex = s.indexOf("#", endIndex); //Index for '#' sign
            int len = Integer.parseInt(s.substring(endIndex, signIndex));
            endIndex = signIndex + 1 + len;
            ret.add(s.substring(signIndex + 1, endIndex));
        }
        return ret;
    }
```
