算法练习(10/2)

153 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目练习一

交错字符串

题目来源:力扣

给定三个字符串 s1s2s3,请你帮忙验证 s3 是否是由 s1s2 交错 组成的。

两个字符串 st 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:

  • s = s1 + s2 + ... + sn
  • t = t1 + t2 + ... + tm
  • |n - m| <= 1
  • 交错s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...

提示: a + b 意味着字符串 ab 连接。
在这里插入图片描述

输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"输出:true
输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"输出:false
输入:s1 = "", s2 = "", s3 = ""输出:true

提示:

  • 0 <= s1.length, s2.length <= 100
  • 0 <= s3.length <= 200
  • s1s2、和 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] <= 10
  • nums 中的所有整数 互不相同

代码如下:

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;
				}
			}
		}
	}
};