首页 > 解决方案 > Java / 解压字符串 /

问题描述

如何解压字符串?输入是一个包含字母、数字和符号形式的字符串,输出是一个包含重复子字符串的字符串。

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

一个重复可能包含另一个。例如: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());

标签: java

解决方案


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

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

首先使用 anindexOf(']')定位字符串中的第一个右括号,它将在位置 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

推荐阅读