本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目练习一
交错字符串
题目来源:力扣
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。
两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:
s = s1 + s2 + ... + snt = t1 + t2 + ... + tm|n - m| <= 1- 交错 是
s1 + t1 + s2 + t2 + s3 + t3 + ...或者t1 + s1 + t2 + s2 + t3 + s3 + ...
提示: a + b 意味着字符串 a 和 b 连接。
输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"输出:true
输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"输出:false
输入:s1 = "", s2 = "", s3 = ""输出:true
提示:
0 <= s1.length, s2.length <= 1000 <= s3.length <= 200s1、s2、和s3都由小写英文字母组成
代码如下:
class Solution {
public:
bool isInterleave(string s1, string s2, string s3)
{
int i, j;
int len1 = s1.length();
int len2 = s2.length();
int len3 = s3.length();
if (len1 + len2 != len3)
return false;
bool* table = (bool*)malloc((len1 + 1) * (len2 + 1) * sizeof(bool));
bool** dp = (bool**)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];
}
};
全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
题目来源:力扣
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
输入:nums = [0,1]
输出:[[0,1],[1,0]]
输入:nums = [1]
输出:[[1]]
提示:
1 <= nums.length <= 6-10 <= nums[i] <= 10nums中的所有整数 互不相同
代码如下:
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<bool> used(nums.size());
dfs(nums, used, res);
return res;
}
private:
vector<int> stack;
void dfs(vector<int>& nums, vector<bool> &used,vector<vector<int>> &res)
{
if (stack.size() == nums.size())
{
res.push_back(stack);
}
else
{
for (int i = 0; i < nums.size(); i++)
{
if (!used[i])
{
used[i] = true;
stack.push_back(nums[i]);
dfs(nums, used, res);
stack.pop_back();
used[i] = false;
}
}
}
}
};