最长回文子串
给定一个字符串s动态规划:从新手到专家(关于动态规划算法最精彩的中文描述,没,找出s中最长的回文子串。
括号生成
数字n代表括号生成的对数,请你设计一个函数,生成所有可能且有效的括号组合。
'''
动态编程:
dp[i] 表示所有有效的组合
dp[i] = "(dp[p]的所有有效组合) + [dp[q]的组合]",其中1 + p + q = i,p从0遍历到i -1动态规划:从新手到专家(关于动态规划算法最精彩的中文描述,没,q对应从 i-1 到 0
/**
* 动态规划
* 从f(1),f(2),...,f(n-1)构建出f(n)
*
* 分析一个解的构成:必然从左括号开始,而这个开始的左括号必然对应着一个一个右括号,
* 因此,任何一个解可以表示为 (A)B。
* 令f(n) = (A)B 其中A和B是规模更小时问题的合法解,并且A、B可以为空,
* 并且A中括号对数+B中括号对数之和为n-1
*
* 也就是说,可以从f(0),f(1),f(2),...,f(n-1构建出f(n),其中f0 = ""表示空解。
*/
public List<String> generateParenthesisDp(int n) {
List<String>[] dp = new List[n+1];
dp[0] = Arrays.asList("");
for (int p = 1; p <= n; p++) {
dp[p] = new ArrayList<>();
for (int q = 0; q < p; q++) {
for (String a : dp[q]) {
for (String b : dp[p-q-1]) {
dp[p].add("("+a+")"+b);
}
}
}
}
return dp[n];
}