在一次采访中,我被要求解决以下问题。
给定一个字符串,计算其中的括号对数。例如,如果字符串是s = "()()"
,则有3对:
s[0], s[1]
s[0], s[3]
s[2], s[3]
我写了以下代码:
int count(char* s) {
int left = 0;
int pair = 0;
for (int i = 0; i < strlen(s); i++) {
char c = s[i];
if (c == '(') {
left++;
} else if (c == ')') {
pair += left;
}
}
return pair;
}
然后出现了另一个问题:
给定长度L和计数N,用s
和strlen(s) == L
确定字符串count(s) == N
(count
是我上面写的函数; {{1}应该只包含括号)。例如,如果L为4且N为3,则字符串为“()()”。
我发现,在示例中,s
也可以是“((()”或“()))”。最好打印符合要求的所有字符串。
任何人都可以解决第二个问题?谢谢。如果你为解决方案编写java或c / c ++代码,那将是非常好的。
答案 0 :(得分:4)
使用正确的计数生成正确长度的字符串是数学练习。
首先让k
成为N
的平方根的最低点。生成k2
字符串的最短字符串长度为2k
。它看起来像(...()...)
。
生成k2+k
字符串的最短字符串长度为2k+1
。您只需将一个)
附加到上一个字符串即可。对于N
和k2
之间的k2+k
,您只需将最左侧的)
滑过正确数量的(
括号。
生成k2+2k
字符串的最短字符串长度为2k+2
。您只需将另一个)
附加到上一个字符串即可。对于N
和k2+k
之间的k2+2k
,您只需将最左侧的)
滑过正确数量的(
括号。
如果N
大于k2+2k
,那么您没有计算平方根的最低限度。 : - )
如果L
短于此长度,则没有解决方案。如果L
大于此长度,那么您只需编写此解决方案并在末尾添加正确数量的(
。
找到解决方案数量的正确方法是使用动态编程。您为所有长度为i
的事物建立了一个表格,有多少个解决方案j
打开括号,总共m
个。 (如果需要,有一些标准方法可以将这种动态编程解决方案转变为列出解决方案的方式。但是列表通常会很长。)
答案 1 :(得分:1)
下面是用Java编写的动态编程解决方案。主要思想是递归地构建满足给定条件的所有可能的字符串。通过添加)
或(
,从结尾到开头构建字符串。让我们用
public static List<String> rec(int len, int n, int r)
一个带有三个参数的方法:len
是仍然要构造的字符串的一部分的长度,n
是count
函数的值,{{1到目前为止,在构建字符串的过程中使用了许多右括号。例如,如果我们要查找“_ _ _())”形式的所有字符串,那么r
和len = 3
。很容易检查:
r = 2
请注意,我们基本上考虑两种情况 - 当我们添加右括号时(在这种情况下rec(len, n, r) = { rec(len - 1, n, r + 1), rec(len - 1, n - r, r) }
递增)我们得到的字符串,以及当我们向当前字符串添加左括号时得到的字符串(在这种情况下,r
变为n
,因为这个新的左括号会匹配到目前为止放置的所有右括号。
我们正在寻找的最终解决方案显然是n - r
。
代码:
rec(len, n, 0)
两个观察结果: