第一次读完这个题目,就感觉这个题目非常之复杂。但是仔细想过之后,就是检测是否长字符串包含短字符串且短字符串是长字符串的结尾部分,如果包含就只保留长字符串。
下面展示一种使用java8 stream解题的方式
基本思路注释在代码里
class Solution {
public int minimumLengthEncoding(String[] words) {
return Arrays.asList(words)
.stream()
// 将字符串反转,例如原来是"abc",反转之后是"cba"
.map(StringBuilder::new)
.map(StringBuilder::reverse)
.map(StringBuilder::toString)
// 将所有的字符串倒叙排序,就是说相同前缀的字符串,较长的排在前面
.sorted(Comparator.reverseOrder())
// 将字符串按照time#bell#的形式组合在一起,如果后面有字符串符合下面条件,就说明这个字符串是前面某个字符串的后缀。
.reduce((s1, s2) -> {
if (s1.contains("#" + s2) || s1.startsWith(s2)) {
return s1;
} else {
return s1 + "#" + s2;
}
})
// 最后获取字符串的长度
.get()
.length() + 1;
}
}
网友评论