[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) {
// ... 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
evalor serialize methods. You should implement your own encode/decode algorithm.
Analysis:
This problem needs some skills in implementation. Once you know the tricky skill underlying it, you would think how it could be so easy!
Instant idea: Can you use some special characters to separate those strings.
Nope! No matter what kind of special characters you use, it may appear in each individual string by chance! Then I have came up with the idea to use certain number of characters to record each string's information in the overall string.
However, how much prefix characters is enough? how to sepearte the information for each string out?
That's a headache problem! The genius idea: why not combinely use special character and size information. Wrap your string in following way in the encode string.
encode_string = size1:{original_string}size2:{original_string}size3:{original_string}size4:{original_string}
each original string is wrap through following way:
original_string ---> size1:{original_string} For a single block, how could we extract the orginal_string out of wraped string?
Step 1: get the start index of the block. Inital start index is 0.
-------------------------------------------------------------------
int next_start = 0; Step 2: use ":" to get the orginal_string's length.
-------------------------------------------------------------------
int split_index = s.indexOf(":", next_start);
int len = Integer.valueOf(s.substring(next_start, split_index)); Step 3: combinely use ":" and length information to extract the original string out.
-------------------------------------------------------------------
String item = s.substring(split_index+1, split_index+1+len);
ret.add(item); Step 4: update the start index for the next string.
-------------------------------------------------------------------
next_start = split_index+1+len;
Wrong Solution:
public class Codec {
// Encodes a list of strings to a single string.
public String encode(List<String> strs) {
if (strs == null)
throw new IllegalArgumentException("strs is null");
StringBuffer buffer = new StringBuffer();
for (String str : strs) {
buffer.append(str.length());
buffer.append(":");
buffer.append(str);
}
return buffer.toString();
}
// Decodes a single string to a list of strings.
public List<String> decode(String s) {
List<String> ret = new ArrayList<String> ();
int next_start = 0;
int split_index = s.indexOf(":");
int len = Integer.valueOf(s.substring(next_start, split_index));
while (next_start < s.length()) {
String item = s.substring(split_index+1, split_index+1+len);
ret.add(item);
next_start = split_index+1+len;
split_index = s.indexOf(":", next_start);
len = Integer.valueOf(s.substring(next_start, split_index));
}
return ret;
}
}
Mistakes Analysis:
Last executed input:
[] Mistake Analysis:
My first implementation is complex and so ugly!!!
Since we need to do the same work for all wrapped strings, we should not allow a singly operation spill out the common block. int next_start = 0;
int split_index = s.indexOf(":"); //what if there is no string in the encoded string!!! This ugly logic incure a corner case!
int len = Integer.valueOf(s.substring(next_start, split_index));
while (next_start < s.length()) {
String item = s.substring(split_index+1, split_index+1+len);
ret.add(item);
next_start = split_index+1+len;
split_index = s.indexOf(":", next_start);
len = Integer.valueOf(s.substring(next_start, split_index));
} What's more, "while (next_start < s.length())" is great checking for cases!
Solution:
public class Codec {
// Encodes a list of strings to a single string.
public String encode(List<String> strs) {
if (strs == null)
throw new IllegalArgumentException("strs is null");
StringBuffer buffer = new StringBuffer();
for (String str : strs) {
buffer.append(str.length());
buffer.append(":");
buffer.append(str);
}
return buffer.toString();
}
// Decodes a single string to a list of strings.
public List<String> decode(String s) {
List<String> ret = new ArrayList<String> ();
int next_start = 0;
while (next_start < s.length()) {
int split_index = s.indexOf(":", next_start);
int len = Integer.valueOf(s.substring(next_start, split_index));
String item = s.substring(split_index+1, split_index+1+len);
ret.add(item);
next_start = split_index+1+len;
}
return ret;
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.decode(codec.encode(strs));
[LeetCode#271] Encode and Decode Strings的更多相关文章
- [LeetCode] 271. Encode and Decode Strings 加码解码字符串
Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...
- 271. Encode and Decode Strings
题目: Design an algorithm to encode a list of strings to a string. The encoded string is then sent ove ...
- [LC] 271. Encode and Decode Strings
Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...
- [LeetCode] Encode and Decode Strings 加码解码字符串
Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...
- LeetCode Encode and Decode Strings
原题链接在这里:https://leetcode.com/problems/encode-and-decode-strings/ 题目: Design an algorithm to encode a ...
- Encode and Decode Strings -- LeetCode
Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...
- [Swift]LeetCode271. 加码解码字符串 $ Encode and Decode Strings
Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...
- Encode and Decode Strings
Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...
- Encode and Decode Strings 解答
Question Design an algorithm to encode a list of strings to a string. The encoded string is then sen ...
随机推荐
- 大数据应用:五大地区喜新厌旧游戏APP类别之比较与分析
今天,我们来分享点不一样的资讯.....游戏APP之喜新厌旧排行榜!! 前阵子笔者开发了一套系统可以用来收集亚洲五大地区上架APP的每日排名信息,希望观察出五大地区在APP上的喜好和使用程度之间的相异 ...
- 6 关于 Oracle NULL栏位和PL./SQL执行实验
今日有针对NULL值有了相关实验. 对NULL 值插入的讨论. 1, PL/SQL 中可以执行插入''或者NULL 的操作, 前提是栏位允许为空. 2, 可以对NULL进行一系列数据库运算. 如: ...
- 【转】Spring.NET学习笔记——目录
目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...
- mysql 刘道成视频教程 第4-8课 --- 数据类型
数据类型大纲图: 注:在mysql中,输入时,除了数值型,不要加单引号,其他的都要加上单引号,养成一种好习惯. 一.数值型: 整数型: 1)从数学上来讨论tinyint 1. 占据空间 2.存储范围 ...
- VS 2012中消失了的Create UnitTest
前言:最近正在研究一个新项目的开发工作,这个项目的要求是必须写UnitTest,对于我个人来讲是很不喜欢写UnitTest的感觉这个东西会很大程度的延误开发进度,所以之前项目的UnitTest是能不写 ...
- 获得SQLSERVER的表字段等架构信息
获得SQLSERVER的表字段等架构信息 SELECT 表名 = CASE WHEN A.COLORDER=1 THEN D.NAME ELSE '' END, 表說明 = CASE WHEN A.C ...
- Touch组件实现原理
Touch组件的实现主要解决了在pc端和移动端拖拽元素的功能. PC端: 依靠事件: mousedown,mousemove,mouseup的鼠标事件.过程: 1. mousedown事件中记录当前元 ...
- [转]操作xml,将xml数据显示到treeview的C#代码
XmlDocument xml = new XmlDocument(); private void Form1_Load(object sender, EventArgs e) { CreateXML ...
- winfrom中按钮文本&的显示问题/按钮快捷键设置问题
其实这个问题是因为“&”有特殊的意义-就是可以作为快捷键 第一种:Alt + *(按钮快捷键) 在大家给button.label.menuStrip等控件设置Text属性时在名字后边加& ...
- javaScript常用方法整合(项目中用到过的)
防止输入空格.缩进等字符: function trim(str){ return str.replace(/^\s+|\s+$/g,""); } JS去掉style样式标签 fun ...