我花了一天的时间解决这个问题,却找不到通过大型数据集的解决方案。
问题
n个括号序列由n个“(” s和n“)”组成。
现在,我们有了所有有效的n个括号序列。按 字典 顺序找到第k个最小序列。
例如,以下是按字母顺序排列的所有有效3个括号序列:
((())) (()()) (())() ()(()) ()()()
给定n和k,编写一种算法,以 字典 顺序给出第k个最小序列。
对于大数据集:1 ≤ n ≤ 100和1 ≤ k ≤ 10^18
1 ≤ n ≤ 100
1 ≤ k ≤ 10^18
通过使用 动态编程* 可以解决此问题 *
dp[n][m]
n
m
基本情况: dp[0][a] = 1 (a >=0)
dp[0][a] = 1 (a >=0)
使用基本情况填写矩阵: dp[n][m] = dp[n - 1][m] + (n < m ? dp[n][m - 1]:0 );
dp[n][m] = dp[n - 1][m] + (n < m ? dp[n][m - 1]:0 );
然后,我们可以慢慢建立第k个括号。
while(k is not 0): If number dp[a][b] >= k: If (dp[a - 1][b] >= k) is true: * Append an open bracket '(' to the current result * Decrease a Else: //k is the number of previous smaller lexicographical parentheses * Adjust value of k: `k -= dp[a -1][b]`, * Append a close bracket ')' * Decrease b Else k is invalid
请注意,按字典顺序,左括号小于右括号,因此我们总是尝试首先添加左括号。