LeetCode229周赛

5685.交替合并字符串

模拟最简单的字符串合并,两个指针索引就可以

class Solution {
     
public:
    string mergeAlternately(string word1, string word2) {
     
        int n1=word1.size();
        int n2=word2.size();
        string s;
        int l=0,r=0;
        while(l<n1 && r<n2)
        {
     
            s+=word1[l];l++;
            s+=word2[r];r++;
        }
        while(l<n1) s+=word1[l++];
        while(r<n2) s+=word2[r++];
        return s;
    }
};

5686.移动所有球到每个盒子所需的最小操作数

模拟因为数据量小,所有两层循环完全可以。

class Solution {
     
public:
    vector<int> minOperations(string b) {
     
        int n=b.size();
        vector<int>res(n);
        for(int i=0;i<n;i++){
     
            int sum=0;
            for(int j=0;j<n;j++)
            {
     
                if(b[j]=='1')
                sum+=abs(j-i);
            }
            res[i]=sum;
        }
        return res;
    }
};

5687.执行乘法运算的最大分数

区间DP

dp[i][j]代表前i个和后j个数得到的最大分数。

状态转移时,dp[i][j]来自dp[i-1][j]和当前数乘上mul的和 , dp[i][j-1]和当前数乘上mul的和 的最大值。

初始化时,dp[i][0]只能来自dp[i-1][0],dp[0][j]只能来自dp[0][j-1].

class Solution {
     
public:
    int maximumScore(vector<int>& nums, vector<int>& mul) {
     
        int n = nums.size();
        int m = mul.size();
        vector<vector<int>>dp(m+1,vector<int>(m+1));
        dp[0][0] = 0;
        for (int i = 1;i <= m;++i) dp[i][0] = dp[i - 1][0] + nums[i - 1] * mul[i - 1];
        for (int j = 1;j <= m;++j) dp[0][j] = dp[0][j - 1] + nums[n - j] * mul[j - 1];
        for (int i = 1;i <= m;++i){
     
            for (int j = 1;i + j <= m;++j){
     
                dp[i][j] = max(dp[i - 1][j] + nums[i - 1] * mul[i + j - 1],dp[i][j - 1] + nums[n - j] * mul[i + j - 1]);
            }
        }
        int ans = INT_MIN;
        for (int i = 0;i <= m;++i) ans = max(ans,dp[i][m - i]);
        return ans;
    }
};

5688.由子序列构造的最长回文串的长度

DP求最长回文串+限制条件

把两个串合成一个长串,然后在更新长度时,只有当i属于word1,j属于word2时,才更新最大值。

class Solution {
     
public:
    int longestPalindrome(string word1, string word2) {
     
        int n1=word1.size();
        int n2=word2.size();
        string s=word1+word2;
        int res=0;
        int n=s.size();
        vector<vector<int>>f(n,vector<int>(n,0));
        for(int i=n-1; i>=0; i--)
        {
     
            f[i][i] = 1;

            for( int j= i+1; j<n ; j++)
            {
     
                if(s[i] == s[j])
                {
     
                    f[i][j] = f[i+1][j-1] + 2;
                    if(i < n1 && j >= n1){
     
                        res = max(res, f[i][j]);
                    }
                }
                else
                {
     
                    f[i][j] = max(f[i + 1][j], f[i][j - 1]);
                }
            }
        }
        return res;
    }
};

你可能感兴趣的:(leetcode,算法,动态规划)