题目一:
题目如下:
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.
解答如下:http://blog.csdn.net/feliciafay/article/details/18204217
题目二:interleaving-string
题目如下:
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 ="aabcc",
s2 ="dbbca",
When s3 ="aadbbcbcac", return true.
When s3 ="aadbbbaccc", return false.
像这种判断能否按照某种规则来完成求是否或者某个量的题目,很容易会想到用动态规划来实现。
先说说维护量,res[i][j]表示用s1的前i个字符和s2的前j个字符能不能按照规则表示出s3的前i+j个字符,如此最后结果就是res[s1.length()][s2.length()],判断是否为真即可。接下来就是递推式了,假设知道res[i][j]之前的所有历史信息,我们怎么得到res[i][j]。可以看出,其实只有两种方式来递推,一种是选取s1的字符作为s3新加进来的字符,另一种是选s2的字符作为新进字符。而要看看能不能选取,就是判断s1(s2)的第i(j)个字符是否与s3的i+j个字符相等。如果可以选取并且对应的res[i-1][j](res[i][j-1])也为真,就说明s3的i+j个字符可以被表示。这两种情况只要有一种成立,就说明res[i][j]为真,是一个或的关系。所以递推式可以表示成res[i][j] = res[i-1][j]&&s1.charAt(i-1)==s3.charAt(i+j-1) || res[i][j-1]&&s2.charAt(j-1)==s3.charAt(i+j-1)
解法一:
class Solution {
public://==的优先级高于&&,&&的优先级高于=
bool isInterleave(string s1, string s2, string s3) {
//dp[i][j]表示S1前i个字符与S2前j个字符是否构成s3前i+j个字符
int rows = s1.length();
int cols = s2.length();
int lens = s3.length();
if (rows + cols != lens){
return false;
}
if (rows == 0 || cols == 0){
if (rows == 0 && s2 != s3) return false;
if (cols == 0 && s1 != s3) return false;
}
vector<vector<int> > dp(rows+1, vector<int>(cols+1, false));
dp[0][0] = true;
for (int i = 1; i <= rows; i++){
dp[i][0] = dp[i-1][0] && (s1[i-1] == s3[i-1]);
}
for (int i = 1; i <= cols; i++){
dp[0][i] = dp[0][i-1] && (s2[i-1] == s3[i-1]);
}
for (int i = 1; i <= rows; i++){
for (int j = 1; j <= cols; j++){
//要想满足条件,则s3的最后一个字符要么是s1的最后一个,要么是s2的最后一个,并且其余字符要能够匹配
if (s3[i+j-1] == s1[i-1] && dp[i-1][j]){
dp[i][j] = true;
}
else if (s3[i+j-1] == s2[j-1] && dp[i][j-1]){
dp[i][j] = true;
}
else {
dp[i][j] = false;
}
}
}
return dp[rows][cols];
}
};
解法二:优化成一维数组
参考下面的链接:
http://blog.csdn.net/linhuanmars/article/details/24683159
解法二:
参考下面的链接:
http://blog.csdn.net/linhuanmars/article/details/24683159