【发布时间】:2021-02-28 13:33:42
【问题描述】:
我正在尝试获取给定的字符串,当括号前有一个数字时,括号内的内容会重复该次数。我考虑过使用 StringBuilder 并构建了这个函数,但我不确定如何重复括号的内部。 示例- 3(ab) - 结果为 ababab ,示例- 3(b(2(c))) 结果为 bccbccbcc 在我在这里构建的函数中,它重复括号而不是括号的内容。
public static String solve(String s){
StringBuilder sb = new StringBuilder();
int repeat = 0;
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) {
repeat = repeat * 10 + Character.getNumericValue(c);
} else {
while (repeat > 0) {
sb.append(c);
repeat--;
}
sb.append(c);
}
}
return sb.toString();
}
}
【问题讨论】:
-
这里有点棘手的部分是找到匹配的括号。最简单的方法可能是使用多次传递,其中每次传递仅在下一个关闭括号之前替换没有左括号的部分。当没有更多的括号时,您可以停止,或者您发现语法错误(例如,只剩下一个括号)
-
括号前面的数字是否始终为单个数字,或者
12(b)也是有效输入?并且数字也可以出现在括号前面以外的其他地方吗?例如3(a4b)? -
输入将仅包含有效括号中的小写字母和数字(1 到 9)。最后一个右括号后没有字母或数字。
-
就上下文而言,更一般的任务称为解析,或构建parse tree 或syntax tree (wikipedia)。有这方面的库,但对于您相对简单的语法来说,它们可能有点矫枉过正。构建树形结构可以让您一次性完成此操作。 (您不需要实际创建树,但考虑递归方法会有所帮助)。
-
括号前面的字母怎么样,比如你的第二个例子:
3(b(2(c)))=>3(b(cc))?
标签: java string algorithm stringbuilder expansion