336. 文本压缩
给你一个只含有可见字符(ASCII 码范围
32
3
2
至
126
1
2
6
)文本文件,文件中可能出现一些重复的单词,你需要对它们进行压缩。
压缩规则如下:
-
如果原文件中的字符不是英文字符,那么保留这些字符。
-
我们将连续的英文字符视为一个单词,单词的前后不应该还有其它的英文字符。
-
如果一个单词在它之前的文本中没有出现过,那么保留它。
-
如果一个单词在它之前出现过,将其替换成前文中它第一次出现是第几个不同单词的编号。
-
样例
输入:
Please, please do it--it would please Mary very,
very much.
Thanks
输出:
Please, please do it--4 would 2 Mary very,
7 much.
Thanks
说明
样例中,
please
是第
2
2
个出现的不同的单词,
it
是第
4
4
个出现的不同的单词,
very
是第
7
7
个出现的不同的单词。
注意事项
压缩中应该大小写敏感,"Abc" 和 "abc" 不是同一个单词。
文本中总的字符数为
N
N
,
1 \le N \le 10^4
1
≤
N
≤
1
0
4
。
一个单词不会跨行显示。
public class Solution {
/**
* @param lines: the text to compress.
* @return: return the text after compression.
*/
public String[] textCompression(String[] lines) {
String[] result = new String[lines.length];
HashMap<String, Integer> hashMap = new HashMap<>();
for (int i = 0; i < lines.length; i++) {
StringBuilder ret = new StringBuilder();
StringBuilder stringBuilder = new StringBuilder();
for (int j = 0; j < lines[i].length(); j++) {
char c = lines[i].charAt(j);
// System.out.println(c);
if ((c > 64 && c < 91) ||( c > 96 && c < 123)) {
stringBuilder.append(c);
}else {
if (stringBuilder.length()>0) {
String s = stringBuilder.toString();
if (hashMap.containsKey(s)) {
ret.append(hashMap.get(s));
} else {
hashMap.put(s, hashMap.size()+1);
ret.append(s);
}
stringBuilder.delete(0, stringBuilder.length());
}
ret.append(c);
}
}
if (stringBuilder.length()>0) {
String s = stringBuilder.toString();
if (hashMap.containsKey(s)) {
ret.append(hashMap.get(s));
} else {
hashMap.put(s, hashMap.size()+1);
ret.append(s);
}
stringBuilder.delete(0, stringBuilder.length());
}
result[i]=ret.toString();
}
return result;
}
}