当前位置: 首页 > 知识库问答 >
问题:

Java/打开绳子/

艾善
2023-03-14

我怎么才能解开绳子?输入是一个包含字母、数字和符号的形式的字符串,输出是一个包含重复子字符串的字符串。

示例:输入:2[qwe]4[qw]e输出:QWEQWEQWQWQWQWQWE

一个重复可能包含另一个重复。示例:2[3[q]w]=qqqwqqqw

不幸的是,我只能分成组件

==========================================================================================================================

StringBuilder alphabetsBuilder = new StringBuilder();
StringBuilder numbersBuilder = new StringBuilder();
StringBuilder symbolsBuilder = new StringBuilder();

for (int i = 0; i < string.length(); i++) {
    char ch = string.charAt(i);
    int ch2 = string.charAt(i);
    
    if (Character.isAlphabetic(ch)) {
        alphabetsBuilder.append(ch);
    } else if (Character.isDigit(ch)) {
        numbersBuilder.append(ch2);
        } else {
        symbolsBuilder.append(ch);
    }
}
System.out.println("Alphabets in string: " + alphabetsBuilder.toString());
System.out.println("Numbers in String: " + numbersBuilder.toString());
System.out.println("Symbols in String: " + symbolsBuilder.toString());

共有1个答案

阚元白
2023-03-14

对这个问题有许多不同的方法。您可以编写一个解析器,它将递归地处理字符串,在循环中使用正则表达式替换,等等。在每一步中,您尝试找到最里面的一对括号,并用重复多次的相应子字符串替换它。例如,考虑以下输入字符串:

2[3[q]w]e3[q]

首先使用indexof(']')定位字符串中的第一个结束括号,它将在位置5处找到(记住,字符串中的位置以0开头):

2[3[q]w]e3[q]
     ^
     |
 position 5

然后使用此位置之前的子字符串:

2[3[q]

并在这里用lastindexof('[')找到最后一个开始的括号,它将在位置3找到括号:

2[3[q]
   ^
   |
  position 3

现在你需要提取这个括号前面的数字,你会得到重复数:“3”。那么,现在您获取所有这些信息:重复次数和括号之间的子字符串,以生成替换:

3[q] => qqq

现在在原始字符串中进行以下替换:

2[3[q]w]e3[q] => 2[qqqw]e3[q]

现在你从一开始就重复整个过程。

搜索第一个关闭括号,在这里找到它:

2[qqqw]e3[q]
      ^

查找前面子字符串中的最后一个开始括号:

2[qqqw]
 ^

提取重复次数:2,并进行替换

2[qqqw] => qqqwqqqw

在原始字符串中替换:

2[qqqw]e3[q] => qqqwqqqwe3[q]

再次重复整个过程,这将导致替换

qqqwqqqwe3[q] => qqqwqqqweqqq

此时,您将尝试重复整个过程,但找不到任何关闭括号,因此停止并打印结果:

qqqwqqqweqqq
 类似资料:
  • 朋友们好,我有一根绳子 我想将其拆分为和 我试着遵循这样的代码 当我运行上面的代码时,会出现如下错误 at

  • 我这里有一个JPanel,我想跟踪我给玩家的一些猜测。 每次调用PaintComponent时都会显示猜测。这是代码: 所发生的事情是,从先前调用repaint()来调用此方法的字符串不会消失。 这意味着“猜测剩余:”之后的数字在数字开始堆积之后变得不可读(从10开始,在调用方法之前下降一次)。 我看不出为什么这应该是一个问题。我遇到的一个类似问题是,当停止布尔值为真时,它应该退出该方法,而不是绘

  • Leetcode 题目描述 把一根绳子剪成多段,并且使得每段的长度乘积最大。 // html n = 2 return 1 (2 = 1 + 1) n = 10 return 36 (10 = 3 + 3 + 4) 解题思路 贪心 尽可能多剪长度为 3 的绳子,并且不允许有长度为 1 的绳子出现。如果出现了,就从已经切好长度为 3 的绳子中拿出一段与长度为 1 的绳子重新组合,把它们切成两段长

  • 我有一个字符串: 它需要缩短,所以看起来像这样: 所以基本上,它需要使用所有重复的字符,并写下它们重复的次数,而不是打印它们。我设法做到了一半: 但这只适用于重复的字符,而不是模式。我可以通过在字符串中找到ab模式来做到这一点,但这需要对每一个可能的字符串都是可行的。有人遇到过类似的事情吗?

  • 问题内容: 我们正在为bigquery编写一个开源jdbc驱动程序,并遇到以下问题: 我们希望使用Oauth 2授权我们的驱动程序为已安装的应用程序。在Windows XP,Windows 7 X64,Windows 7 X64 + RDP上运行正常。但是在作为Windows Server 2008 R2 + RDP的测试台上,它失败了。 基本上,我们打开一个网络浏览器,他登录,我们捕获回复并验证

  • Oracle Java社区网站上的一篇文章给出了以下方法作为示例(对于JPA转换器,但我想这与此无关): 将字符串y转换为字符串val有什么用?这样做有正当理由吗? 原创文章:JPA中的新功能