提交 4dae11ea 编写于 作者: 每日一练社区's avatar 每日一练社区

update dir sstructure

上级 476e9c90
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [
"leetcode",
"交错字符串"
],
"children": [],
"export": [
"solution.json"
],
"title": "交错字符串"
}
\ No newline at end of file
<p>给定三个字符串 <code>s1</code><code>s2</code><code>s3</code>,请你帮忙验证 <code>s3</code> 是否是由 <code>s1</code> 和 <code>s2</code><em> </em><strong>交错 </strong>组成的。</p><p>两个字符串 <code>s</code><code>t</code> <strong>交错</strong> 的定义与过程如下,其中每个字符串都会被分割成若干 <strong>非空</strong> 子字符串:</p><ul> <li><code>s = s<sub>1</sub> + s<sub>2</sub> + ... + s<sub>n</sub></code></li> <li><code>t = t<sub>1</sub> + t<sub>2</sub> + ... + t<sub>m</sub></code></li> <li><code>|n - m| <= 1</code></li> <li><strong>交错</strong><code>s<sub>1</sub> + t<sub>1</sub> + s<sub>2</sub> + t<sub>2</sub> + s<sub>3</sub> + t<sub>3</sub> + ...</code> 或者 <code>t<sub>1</sub> + s<sub>1</sub> + t<sub>2</sub> + s<sub>2</sub> + t<sub>3</sub> + s<sub>3</sub> + ...</code></li></ul><p><strong>提示:</strong><code>a + b</code> 意味着字符串 <code>a</code><code>b</code> 连接。</p><p> </p><p><strong>示例 1:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0000-0099/0097.Interleaving%20String/images/interleave.jpg" style="width: 561px; height: 203px;" /><pre><strong>输入:</strong>s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"<strong><br />输出:</strong>true</pre><p><strong>示例 2:</strong></p><pre><strong>输入:</strong>s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"<strong><br />输出:</strong>false</pre><p><strong>示例 3:</strong></p><pre><strong>输入:</strong>s1 = "", s2 = "", s3 = ""<strong><br />输出:</strong>true</pre><p> </p><p><strong>提示:</strong></p><ul> <li><code>0 <= s1.length, s2.length <= 100</code></li> <li><code>0 <= s3.length <= 200</code></li> <li><code>s1</code><code>s2</code>、和 <code>s3</code> 都由小写英文字母组成</li></ul>
\ No newline at end of file
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
static bool isInterleave(char *s1, char *s2, char *s3)
{
int i, j;
int len1 = strlen(s1);
int len2 = strlen(s2);
int len3 = strlen(s3);
if (len1 + len2 != len3)
{
return false;
}
bool *table = malloc((len1 + 1) * (len2 + 1) * sizeof(bool));
bool **dp = malloc((len1 + 1) * sizeof(bool *));
for (i = 0; i < len1 + 1; i++)
{
dp[i] = &table[i * (len2 + 1)];
}
dp[0][0] = true;
for (i = 1; i < len1 + 1; i++)
{
dp[i][0] = dp[i - 1][0] && s1[i - 1] == s3[i - 1];
}
for (i = 1; i < len2 + 1; i++)
{
dp[0][i] = dp[0][i - 1] && s2[i - 1] == s3[i - 1];
}
for (i = 1; i < len1 + 1; i++)
{
for (j = 1; j < len2 + 1; j++)
{
bool up = dp[i - 1][j] && s1[i - 1] == s3[i + j - 1];
bool left = dp[i][j - 1] && s2[j - 1] == s3[i + j - 1];
dp[i][j] = up || left;
}
}
return dp[len1][len2];
}
int main(int argc, char **argv)
{
if (argc != 4)
{
fprintf(stderr, "Usage: ./test s1 s2 s3\n");
exit(-1);
}
printf("%s\n", isInterleave(argv[1], argv[2], argv[3]) ? "true" : "false");
return 0;
}
\ No newline at end of file
{
"type": "code_options",
"author": "CSDN.net",
"source": "solution.md",
"exercise_id": "c44af29fd6514841a9306e625c0e8a14"
}
\ No newline at end of file
# 交错字符串
<p>给定三个字符串 <code>s1</code>、<code>s2</code>、<code>s3</code>,请你帮忙验证 <code>s3</code> 是否是由 <code>s1</code> 和 <code>s2</code><em> </em><strong>交错 </strong>组成的。</p><p>两个字符串 <code>s</code> 和 <code>t</code> <strong>交错</strong> 的定义与过程如下,其中每个字符串都会被分割成若干 <strong>非空</strong> 子字符串:</p><ul> <li><code>s = s<sub>1</sub> + s<sub>2</sub> + ... + s<sub>n</sub></code></li> <li><code>t = t<sub>1</sub> + t<sub>2</sub> + ... + t<sub>m</sub></code></li> <li><code>|n - m| <= 1</code></li> <li><strong>交错</strong> 是 <code>s<sub>1</sub> + t<sub>1</sub> + s<sub>2</sub> + t<sub>2</sub> + s<sub>3</sub> + t<sub>3</sub> + ...</code> 或者 <code>t<sub>1</sub> + s<sub>1</sub> + t<sub>2</sub> + s<sub>2</sub> + t<sub>3</sub> + s<sub>3</sub> + ...</code></li></ul><p><strong>提示:</strong><code>a + b</code> 意味着字符串 <code>a</code> 和 <code>b</code> 连接。</p><p> </p><p><strong>示例 1:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0000-0099/0097.Interleaving%20String/images/interleave.jpg" style="width: 561px; height: 203px;" /><pre><strong>输入:</strong>s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"<strong><br />输出:</strong>true</pre><p><strong>示例 2:</strong></p><pre><strong>输入:</strong>s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"<strong><br />输出:</strong>false</pre><p><strong>示例 3:</strong></p><pre><strong>输入:</strong>s1 = "", s2 = "", s3 = ""<strong><br />输出:</strong>true</pre><p> </p><p><strong>提示:</strong></p><ul> <li><code>0 <= s1.length, s2.length <= 100</code></li> <li><code>0 <= s3.length <= 200</code></li> <li><code>s1</code>、<code>s2</code>、和 <code>s3</code> 都由小写英文字母组成</li></ul>
<p>以下错误的选项是?</p>
## aop
### before
```cpp
#include <bits/stdc++.h>
using namespace std;
```
### after
```cpp
int main()
{
Solution sol;
bool res;
string s1 = "aabcc";
string s2 = "dbbca";
string s3 = "aadbbcbcac";
res = sol.isInterleave(s1, s2, s3);
cout << res;
return 0;
}
```
## 答案
```cpp
class Solution
{
public:
bool isInterleave(string s1, string s2, string s3)
{
int len1 = s1.length();
int len2 = s2.length();
int len3 = s3.length();
if (len1 + len2 != len3)
return false;
bool f[len1 + 1][len2 + 1];
f[0][0] = true;
for (int i = 0; i < len1 + 1; i++)
{
for (int j = 0; j < len2 + 1; j++)
{
if (j > 0)
{
f[i][j] = f[i][j - 1] && s3[i + j - 1];
}
if (i > 0)
{
f[i][j] = f[i][j] || (f[i - 1][j] && s3[i + j - 1]);
}
}
}
return f[len1][len2];
}
};
```
## 选项
### A
```cpp
class Solution
{
public:
bool isInterleave(string s1, string s2, string s3)
{
if (s1.size() + s2.size() != s3.size())
return false;
int m = s1.size(), n = s2.size(), i, j, k;
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
dp[0][0] = 1;
for (i = 0; i < m; i++)
if (s1[i] == s3[i])
dp[i + 1][0] = 1;
else
break;
for (i = 0; i < n; i++)
if (s2[i] == s3[i])
dp[0][i + 1] = 1;
else
break;
for (i = 1; i <= m; ++i)
for (j = 1; j <= n; j++)
{
k = i + j;
if (s1[i - 1] == s3[k - 1])
dp[i][j] |= dp[i - 1][j];
if (s2[j - 1] == s3[k - 1])
dp[i][j] |= dp[i][j - 1];
}
return dp[m][n];
}
};
```
### B
```cpp
class Solution
{
public:
bool isInterleave(string s1, string s2, string s3)
{
if (s1.size() + s2.size() != s3.size())
return false;
int m = s1.size(), n = s2.size();
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
dp[0][0] = true;
for (int i = 1; i <= m; ++i)
dp[i][0] = dp[i - 1][0] && (s1[i - 1] == s3[i - 1]);
for (int i = 1; i <= n; ++i)
dp[0][i] = dp[0][i - 1] && (s2[i - 1] == s3[i - 1]);
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= n; ++j)
{
dp[i][j] = (dp[i - 1][j] && s1[i - 1] == s3[i + j - 1]) || (dp[i][j - 1] && s2[j - 1] == s3[i + j - 1]);
}
return dp[m][n];
}
};
```
### C
```cpp
class Solution
{
public:
bool isInterleave(string s1, string s2, string s3)
{
int s1_len = s1.size();
int s2_len = s2.size();
int s3_len = s3.size();
if (s1_len + s2_len != s3_len)
return false;
if (s1_len == 0 || s2_len == 0)
return s1 + s2 == s3;
vector<vector<bool>> dp(s1_len + 1, vector<bool>(s2_len + 1));
dp[0][0] = true;
for (int i = 0; i <= s1_len; i++)
{
for (int j = 0; j <= s2_len; j++)
{
if (dp[i][j])
{
if (i < s1_len && s1[i] == s3[i + j])
dp[i + 1][j] = true;
if (j < s2_len && s2[j] == s3[i + j])
dp[i][j + 1] = true;
}
}
}
return dp[s1_len][s2_len];
}
};
```
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [
"leetcode",
"恢复二叉搜索树"
],
"children": [],
"export": [
"solution.json"
],
"title": "恢复二叉搜索树"
}
\ No newline at end of file
<p>给你二叉搜索树的根节点 <code>root</code> ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。</p><p><strong>进阶:</strong>使用 O(<em>n</em>) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?</p><p> </p><p><strong>示例 1:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0000-0099/0099.Recover%20Binary%20Search%20Tree/images/recover1.jpg" style="width: 422px; height: 302px;" /><pre><strong>输入:</strong>root = [1,3,null,null,2]<strong><br />输出:</strong>[3,1,null,null,2]<strong><br />解释:</strong>3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。</pre><p><strong>示例 2:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0000-0099/0099.Recover%20Binary%20Search%20Tree/images/recover2.jpg" style="width: 581px; height: 302px;" /><pre><strong>输入:</strong>root = [3,1,4,null,null,2]<strong><br />输出:</strong>[2,1,4,null,null,3]<strong><br />解释:</strong>2 不能在 3 的右子树中,因为 2 < 3 交换 2 3 使二叉搜索树有效。</pre><p> </p><p><strong>提示:</strong></p><ul> <li>树上节点的数目在范围 <code>[2, 1000]</code></li> <li><code>-2<sup>31</sup> <= Node.val <= 2<sup>31</sup> - 1</code></li></ul>
\ No newline at end of file
#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution
{
public:
void recoverTree(TreeNode *root)
{
dfs(root);
int tmp = p0_->val;
p0_->val = p1_->val;
p1_->val = tmp;
}
private:
int wrong_ = 0;
TreeNode *prev_ = nullptr;
TreeNode *p0_ = nullptr;
TreeNode *p1_ = nullptr;
void dfs(TreeNode *root)
{
if (root == nullptr || wrong_ == 2)
{
return;
}
dfs(root->left);
if (prev_ != nullptr && prev_->val > root->val)
{
if (++wrong_ == 1)
{
p0_ = prev_;
p1_ = root;
}
else if (wrong_ == 2)
{
p1_ = root;
}
}
prev_ = root;
dfs(root->right);
}
};
\ No newline at end of file
{
"type": "code_options",
"author": "CSDN.net",
"source": "solution.md",
"exercise_id": "6f36dd5736a941d091ed802411238645"
}
\ No newline at end of file
# 恢复二叉搜索树
<p>给你二叉搜索树的根节点 <code>root</code> ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。</p><p><strong>进阶:</strong>使用 O(<em>n</em>) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?</p><p> </p><p><strong>示例 1:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0000-0099/0099.Recover%20Binary%20Search%20Tree/images/recover1.jpg" style="width: 422px; height: 302px;" /><pre><strong>输入:</strong>root = [1,3,null,null,2]<strong><br />输出:</strong>[3,1,null,null,2]<strong><br />解释:</strong>3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。</pre><p><strong>示例 2:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0000-0099/0099.Recover%20Binary%20Search%20Tree/images/recover2.jpg" style="width: 581px; height: 302px;" /><pre><strong>输入:</strong>root = [3,1,4,null,null,2]<strong><br />输出:</strong>[2,1,4,null,null,3]<strong><br />解释:</strong>2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。</pre><p> </p><p><strong>提示:</strong></p><ul> <li>树上节点的数目在范围 <code>[2, 1000]</code> 内</li> <li><code>-2<sup>31</sup> <= Node.val <= 2<sup>31</sup> - 1</code></li></ul>
<p>以下错误的选项是?</p>
## aop
### before
```cpp
#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
```
### after
```cpp
```
## 答案
```cpp
class Solution
{
public:
TreeNode *pre = NULL;
TreeNode *one = NULL;
TreeNode *two = NULL;
bool search(TreeNode *root)
{
if (root == NULL)
return false;
if (search(root->left))
return true;
if (pre != NULL && pre->val > root->val)
{
if (one == NULL)
{
one = root;
two = pre;
}
else
{
two = root;
return true;
}
}
pre = root;
if (search(root->right))
return true;
return false;
}
void recoverTree(TreeNode *root)
{
search(root);
swap(one->val, two->val);
}
};
```
## 选项
### A
```cpp
class Solution
{
public:
TreeNode *x, *y, *pre;
void DFS(TreeNode *root)
{
if (root == nullptr)
return;
DFS(root->left);
if (pre && root->val < pre->val)
{
x = root;
if (!y)
y = pre;
else
return;
}
pre = root;
DFS(root->right);
}
void recoverTree(TreeNode *root)
{
DFS(root);
swap(x->val, y->val);
}
};
```
### B
```cpp
class Solution
{
public:
void insert(int val, vector<int> &vals)
{
if (vals.size() > 0)
{
for (int i = 0; i < vals.size(); i++)
{
if (val < vals[i])
{
vals.insert(vals.begin() + i, val);
return;
}
}
}
vals.push_back(val);
}
void recoverTree(TreeNode *root)
{
stack<TreeNode *> s;
vector<int> vals;
TreeNode *tem = root;
while (tem || !s.empty())
{
while (tem)
{
s.push(tem);
tem = tem->left;
}
if (!s.empty())
{
tem = s.top();
s.pop();
insert(tem->val, vals);
tem = tem->right;
}
}
tem = root;
int j = 0;
while (tem || !s.empty())
{
while (tem)
{
s.push(tem);
tem = tem->left;
}
if (!s.empty())
{
tem = s.top();
s.pop();
tem->val = vals[j++];
tem = tem->right;
}
}
}
};
```
### C
```cpp
class Solution
{
public:
vector<TreeNode *> order;
void inOrder(TreeNode *root)
{
if (root->left)
inOrder(root->left);
order.push_back(root);
if (root->right)
inOrder(root->right);
}
void recoverTree(TreeNode *root)
{
inOrder(root);
int left = -1, right = -1;
for (int i = 0; i < order.size() - 1; ++i)
{
if (order[i]->val > order[i + 1]->val)
{
if (left == -1)
left = i;
right = i + 1;
}
}
if (right == -1)
swap(order[left]->val, order[left + 1]->val);
else
swap(order[left]->val, order[right]->val);
}
};
```
{
"node_id": "569d5e11c4fc5de7844053d9a733c5e8",
"keywords": [
"leetcode",
"相同的树"
],
"children": [],
"export": [
"solution.json"
],
"title": "相同的树"
}
\ No newline at end of file
<p>给你两棵二叉树的根节点 <code>p</code><code>q</code> ,编写一个函数来检验这两棵树是否相同。</p><p>如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。</p><p> </p><p><strong>示例 1:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0100-0199/0100.Same%20Tree/images/ex1.jpg" style="width: 622px; height: 182px;" /><pre><strong>输入:</strong>p = [1,2,3], q = [1,2,3]<strong><br />输出:</strong>true</pre><p><strong>示例 2:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0100-0199/0100.Same%20Tree/images/ex2.jpg" style="width: 382px; height: 182px;" /><pre><strong>输入:</strong>p = [1,2], q = [1,null,2]<strong><br />输出:</strong>false</pre><p><strong>示例 3:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0100-0199/0100.Same%20Tree/images/ex3.jpg" style="width: 622px; height: 182px;" /><pre><strong>输入:</strong>p = [1,2,1], q = [1,1,2]<strong><br />输出:</strong>false</pre><p> </p><p><strong>提示:</strong></p><ul> <li>两棵树上的节点数目都在范围 <code>[0, 100]</code></li> <li><code>-10<sup>4</sup> <= Node.val <= 10<sup>4</sup></code></li></ul>
\ No newline at end of file
#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution
{
public:
bool isSameTree(TreeNode *p, TreeNode *q)
{
if (p == nullptr && q == nullptr)
{
return true;
}
if (p == nullptr || q == nullptr)
{
return false;
}
if (p->val != q->val)
{
return false;
}
return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
};
\ No newline at end of file
{
"type": "code_options",
"author": "CSDN.net",
"source": "solution.md",
"exercise_id": "0f00b8981cd541598110de5d1445d8f6"
}
\ No newline at end of file
# 相同的树
<p>给你两棵二叉树的根节点 <code>p</code> 和 <code>q</code> ,编写一个函数来检验这两棵树是否相同。</p><p>如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。</p><p> </p><p><strong>示例 1:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0100-0199/0100.Same%20Tree/images/ex1.jpg" style="width: 622px; height: 182px;" /><pre><strong>输入:</strong>p = [1,2,3], q = [1,2,3]<strong><br />输出:</strong>true</pre><p><strong>示例 2:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0100-0199/0100.Same%20Tree/images/ex2.jpg" style="width: 382px; height: 182px;" /><pre><strong>输入:</strong>p = [1,2], q = [1,null,2]<strong><br />输出:</strong>false</pre><p><strong>示例 3:</strong></p><img alt="" src="https://cdn.jsdelivr.net/gh/doocs/leetcode@main/solution/0100-0199/0100.Same%20Tree/images/ex3.jpg" style="width: 622px; height: 182px;" /><pre><strong>输入:</strong>p = [1,2,1], q = [1,1,2]<strong><br />输出:</strong>false</pre><p> </p><p><strong>提示:</strong></p><ul> <li>两棵树上的节点数目都在范围 <code>[0, 100]</code> 内</li> <li><code>-10<sup>4</sup> <= Node.val <= 10<sup>4</sup></code></li></ul>
<p>以下错误的选项是?</p>
## aop
### before
```cpp
#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
```
### after
```cpp
```
## 答案
```cpp
都是错的
```
## 选项
### A
```cpp
class Solution
{
public:
bool isSameTree(TreeNode *p, TreeNode *q)
{
if (p == nullptr)
return q == nullptr;
return q != nullptr && p->val == q->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
};
```
### B
```cpp
class Solution
{
public:
bool isSameTree(TreeNode *p, TreeNode *q)
{
TreeNode *temp, *temq;
temp = p;
temq = q;
bool lb, rb;
if (!p && !q)
return true;
if ((!p || !q) || p->val != q->val)
return false;
else
{
lb = isSameTree(p->left, q->left);
rb = isSameTree(p->right, q->right);
}
if (lb && rb)
return true;
else
return false;
}
};
```
### C
```cpp
class Solution
{
public:
bool isSameTree(TreeNode *p, TreeNode *q)
{
if (p == NULL && q == NULL)
return true;
if (p == NULL || q == NULL)
return false;
if (p->val != q->val)
return false;
return (isSameTree(p->left, q->left) && isSameTree(p->right, q->right));
}
};
```
......@@ -4,30 +4,155 @@
## aop
### before
```cpp
#include <bits/stdc++.h>
using namespace std;
```
### after
```cpp
int main()
{
Solution sol;
bool res;
string s1 = "aabcc";
string s2 = "dbbca";
string s3 = "aadbbcbcac";
res = sol.isInterleave(s1, s2, s3);
cout << res;
return 0;
}
```
## 答案
```cpp
class Solution
{
public:
bool isInterleave(string s1, string s2, string s3)
{
int len1 = s1.length();
int len2 = s2.length();
int len3 = s3.length();
if (len1 + len2 != len3)
return false;
bool f[len1 + 1][len2 + 1];
f[0][0] = true;
for (int i = 0; i < len1 + 1; i++)
{
for (int j = 0; j < len2 + 1; j++)
{
if (j > 0)
{
f[i][j] = f[i][j - 1] && s3[i + j - 1];
}
if (i > 0)
{
f[i][j] = f[i][j] || (f[i - 1][j] && s3[i + j - 1]);
}
}
}
return f[len1][len2];
}
};
```
## 选项
### A
```cpp
class Solution
{
public:
bool isInterleave(string s1, string s2, string s3)
{
if (s1.size() + s2.size() != s3.size())
return false;
int m = s1.size(), n = s2.size(), i, j, k;
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
dp[0][0] = 1;
for (i = 0; i < m; i++)
if (s1[i] == s3[i])
dp[i + 1][0] = 1;
else
break;
for (i = 0; i < n; i++)
if (s2[i] == s3[i])
dp[0][i + 1] = 1;
else
break;
for (i = 1; i <= m; ++i)
for (j = 1; j <= n; j++)
{
k = i + j;
if (s1[i - 1] == s3[k - 1])
dp[i][j] |= dp[i - 1][j];
if (s2[j - 1] == s3[k - 1])
dp[i][j] |= dp[i][j - 1];
}
return dp[m][n];
}
};
```
### B
```cpp
class Solution
{
public:
bool isInterleave(string s1, string s2, string s3)
{
if (s1.size() + s2.size() != s3.size())
return false;
int m = s1.size(), n = s2.size();
vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
dp[0][0] = true;
for (int i = 1; i <= m; ++i)
dp[i][0] = dp[i - 1][0] && (s1[i - 1] == s3[i - 1]);
for (int i = 1; i <= n; ++i)
dp[0][i] = dp[0][i - 1] && (s2[i - 1] == s3[i - 1]);
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= n; ++j)
{
dp[i][j] = (dp[i - 1][j] && s1[i - 1] == s3[i + j - 1]) || (dp[i][j - 1] && s2[j - 1] == s3[i + j - 1]);
}
return dp[m][n];
}
};
```
### C
```cpp
class Solution
{
public:
bool isInterleave(string s1, string s2, string s3)
{
int s1_len = s1.size();
int s2_len = s2.size();
int s3_len = s3.size();
if (s1_len + s2_len != s3_len)
return false;
if (s1_len == 0 || s2_len == 0)
return s1 + s2 == s3;
vector<vector<bool>> dp(s1_len + 1, vector<bool>(s2_len + 1));
dp[0][0] = true;
for (int i = 0; i <= s1_len; i++)
{
for (int j = 0; j <= s2_len; j++)
{
if (dp[i][j])
{
if (i < s1_len && s1[i] == s3[i + j])
dp[i + 1][j] = true;
if (j < s2_len && s2[j] == s3[i + j])
dp[i][j + 1] = true;
}
}
}
return dp[s1_len][s2_len];
}
};
```
......@@ -4,7 +4,18 @@
## aop
### before
```cpp
#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
```
### after
```cpp
......@@ -13,21 +24,167 @@
## 答案
```cpp
class Solution
{
public:
TreeNode *pre = NULL;
TreeNode *one = NULL;
TreeNode *two = NULL;
bool search(TreeNode *root)
{
if (root == NULL)
return false;
if (search(root->left))
return true;
if (pre != NULL && pre->val > root->val)
{
if (one == NULL)
{
one = root;
two = pre;
}
else
{
two = root;
return true;
}
}
pre = root;
if (search(root->right))
return true;
return false;
}
void recoverTree(TreeNode *root)
{
search(root);
swap(one->val, two->val);
}
};
```
## 选项
### A
```cpp
class Solution
{
public:
TreeNode *x, *y, *pre;
void DFS(TreeNode *root)
{
if (root == nullptr)
return;
DFS(root->left);
if (pre && root->val < pre->val)
{
x = root;
if (!y)
y = pre;
else
return;
}
pre = root;
DFS(root->right);
}
void recoverTree(TreeNode *root)
{
DFS(root);
swap(x->val, y->val);
}
};
```
### B
```cpp
class Solution
{
public:
void insert(int val, vector<int> &vals)
{
if (vals.size() > 0)
{
for (int i = 0; i < vals.size(); i++)
{
if (val < vals[i])
{
vals.insert(vals.begin() + i, val);
return;
}
}
}
vals.push_back(val);
}
void recoverTree(TreeNode *root)
{
stack<TreeNode *> s;
vector<int> vals;
TreeNode *tem = root;
while (tem || !s.empty())
{
while (tem)
{
s.push(tem);
tem = tem->left;
}
if (!s.empty())
{
tem = s.top();
s.pop();
insert(tem->val, vals);
tem = tem->right;
}
}
tem = root;
int j = 0;
while (tem || !s.empty())
{
while (tem)
{
s.push(tem);
tem = tem->left;
}
if (!s.empty())
{
tem = s.top();
s.pop();
tem->val = vals[j++];
tem = tem->right;
}
}
}
};
```
### C
```cpp
class Solution
{
public:
vector<TreeNode *> order;
void inOrder(TreeNode *root)
{
if (root->left)
inOrder(root->left);
order.push_back(root);
if (root->right)
inOrder(root->right);
}
void recoverTree(TreeNode *root)
{
inOrder(root);
int left = -1, right = -1;
for (int i = 0; i < order.size() - 1; ++i)
{
if (order[i]->val > order[i + 1]->val)
{
if (left == -1)
left = i;
right = i + 1;
}
}
if (right == -1)
swap(order[left]->val, order[left + 1]->val);
else
swap(order[left]->val, order[right]->val);
}
};
```
......@@ -4,6 +4,18 @@
## aop
### before
```cpp
#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
```
### after
......@@ -13,21 +25,66 @@
## 答案
```cpp
都是错的
```
## 选项
### A
```cpp
class Solution
{
public:
bool isSameTree(TreeNode *p, TreeNode *q)
{
if (p == nullptr)
return q == nullptr;
return q != nullptr && p->val == q->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
};
```
### B
```cpp
class Solution
{
public:
bool isSameTree(TreeNode *p, TreeNode *q)
{
TreeNode *temp, *temq;
temp = p;
temq = q;
bool lb, rb;
if (!p && !q)
return true;
if ((!p || !q) || p->val != q->val)
return false;
else
{
lb = isSameTree(p->left, q->left);
rb = isSameTree(p->right, q->right);
}
if (lb && rb)
return true;
else
return false;
}
};
```
### C
```cpp
class Solution
{
public:
bool isSameTree(TreeNode *p, TreeNode *q)
{
if (p == NULL && q == NULL)
return true;
if (p == NULL || q == NULL)
return false;
if (p->val != q->val)
return false;
return (isSameTree(p->left, q->left) && isSameTree(p->right, q->right));
}
};
```
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册