【问题标题】:Secret cipher code,can someone resolve the issue please密码密码,有人可以解决这个问题吗
【发布时间】: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


【解决方案1】:

请确保字符串 s 的最大长度可能是 10^5 而不是 105(我在 GFG 提到了这个问题)。由于字符串的长度很大,如果使用上述方法,那么在某些情况下,JVM可能无法为方法的递归调用分配内存。

因此它照常显示outofmemory 错误。

【讨论】:

  • 是的,它是 10^5,但我如何将最大长度设置为 10^5。
  • 我可以很容易地存储在字符串数据类型中。但在这里我想解释一下,用如此长的字符串重新调用递归函数可能会导致内存不足错误。您应该选择任何迭代方法。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2016-10-22
相关资源
最近更新 更多