【发布时间】:2022-01-13 19:09:10
【问题描述】:
Geek 想要以字符串 S 的形式向他的朋友 Keeg 发送一条加密消息以及如何破译该消息的说明。为了破译消息,他的朋友需要从左到右遍历消息字符串,如果他找到*,他必须删除它并将到目前为止读取的所有字母添加到字符串中。他必须继续这样做,直到他摆脱所有*。
你能帮 Geek 加密他的消息字符串 S 吗?
注意:如果字符串可以用多种方式加密,请找出最小的加密字符串。
示例 1:
Input: S = "ababcababcd"
Output: ab*c*d
解释:我们可以加密字符串
通过以下方式:"ababcababcd" -> "ababc*d" -> "ab*c*d"
示例 2:
Input: S = "zzzzzzz"
Output: z*z*z
说明:字符串可以加密
有两种方式:"z*z*z" 和 "z**zzz"。在......之外
两个"z*z*z" 的长度更小。
预期时间复杂度:O(N)
预期辅助空间:O(N)
约束:1 ≤ |S| ≤ 105
答案:
public String compress(String s) {
if(s.length()==1) return s;
if(s.length()%2==0){
if(s.substring(0,s.length()/2).equals(s.substring(s.length()/2,s.length()))) {
return s.substring(0,s.length()/2)+"*";
}
}
String left=compress(s.substring(0,s.length()-1))+s.charAt(s.length()-1);
return left;
}
我没有从这段代码中得到正确的解决方案,但在某些情况下,它在main 方法中显示了这个java.lang.OutOfMemoryError。
【问题讨论】:
-
请了解如何格式化您的代码。我建议您至少将编辑器设置为使用空格而不是制表符,这样更容易修复。您使用
==而不是equals进行字符串比较时犯了一个非常基本的错误。请先修复该问题并创建一个minimal reproducible example,包括您的main。或者学习如何使用调试器,如果你准备好了的话。 -
顺便说一下,如果不涉及密钥,则称为 encoding,或者实际上是 compression 而不是 encryption .
标签: java string compression