100-46.搜狐(运算)

46.搜狐(运算):
四对括号可以有多少种匹配排列方式?

比如两对括号可以有两种:()()和(())

思路:

这段思路是在网上找的。我本来以为是要遍历所有的情况。然后在判断每种情况是否符合括号匹配的情况就行了。不过反过来看这样做的时间复杂度貌似是指数级的。所以。。。然后在网上搜了下,找到了,这种组合数学的解法。原来,这里面是有规律可循的。有个卡特兰数的东西。。

n对括号有多少种匹配方式?

       思路:n对括号相当于有2n个符号,n个左括号、n个右括号,可以设问题的解为f(2n)。第0个符号肯定为左括号,与之匹配的右括号必须为第2i+1字符。因为如果是第2i个字符,那么第0个字符与第2i个字符间包含奇数个字符,而奇数个字符是无法构成匹配的。

       通过简单分析,f(2n)可以转化如下的递推式 f(2n) = f(0)*f(2n-2) + f(2)*f(2n - 4) + ... + f(2n - 4)*f(2) + f(2n-2)*f(0)。简单解释一下,f(0) * f(2n-2)表示第0个字符与第1个字符匹配,同时剩余字符分成两个部分,一部分为0个字符,另一部分为2n-2个字符,然后对这两部分求解。 f(2)*f(2n-4)表示第0个字符与第3个字符匹配,同时剩余字符分成两个部分,一部分为2个字符,另一部分为2n-4个字符。依次类推。

       假设f(0) = 1,计算一下开始几项,f(2) = 1, f(4) = 2, f(6) = 5。结合递归式,不难发现f(2n) 等于h(n)。

http://buptdtt.blog.51cto.com/2369962/832586


代码就比较简单了。


你可能感兴趣的:(100-46.搜狐(运算))