leetcode周赛 (2020/05/24)

纪念第一次"AK"(12:02 AK。。。最后一题太蠢了 这么简单个动态规划,找bug找了很久)
leetcode最近周赛好像越来越简单了啊,最后一题的动态规划也不难。

1. 检查单词是否为句中其他单词的前缀

leetcode周赛 (2020/05/24)_第1张图片

代码

class Solution {
public:
    int isPrefixOfWord(string sentence, string searchWord) {
        istringstream ss(sentence);
        string word;
        int ind = 1;
        int ans = -1;
        while(ss>>word)
        {
            int N = searchWord.length();
            if(strcmp(word.substr(0,N).c_str(),searchWord.c_str())==0)
            {
                ans = ind;
                break;
            }
            ind++;
        }
        return ans;
    }
};

2. 定长子串中元音的最大数目

leetcode周赛 (2020/05/24)_第2张图片

代码

class Solution {
public:
    int maxVowels(string s, int k) {
        set<char> vowel;
        char ch[6] = "aeiou";
        for(int i=0;i<5;i++)
            vowel.insert(ch[i]);
        int N = s.length();
        int maxi = -1;
        int tmp = 0;
        for(int i=0;i<k;i++)
            if(vowel.find(s[i])!=vowel.end())
                tmp++;
        maxi = max(maxi,tmp);
        for(int i=1;i+k-1<N;i++)
        {
            int j = i+k-1;
            if(vowel.find(s[i-1])!=vowel.end())
                tmp--;
            if(vowel.find(s[j])!=vowel.end())
                tmp++;
            maxi = max(maxi,tmp);
        }
        return maxi;
    }
};

3. 二叉树中的伪回文路径

leetcode周赛 (2020/05/24)_第3张图片

代码

/**
 * Definition for a binary tree node.
 * 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:
    vector<vector<int>> paths;
    void getPath(TreeNode* root, vector<int>& path)
    {
        path.push_back(root->val);
        if(root->left==nullptr&&root->right==nullptr)
        {
            paths.push_back(path);
        }
        if(root->left)
        {
            getPath(root->left,path);
        }
        if(root->right)
        {
            getPath(root->right,path);
        }
        path.pop_back();
    }
    int pseudoPalindromicPaths (TreeNode* root) {
        vector<int> path;
        getPath(root,path);
        int ans = 0;
        for(auto path:paths)
        {
            unordered_map<int,int> m;
            for(int x:path)
            {
                m[x]++;
            }
            int N = path.size();
            int odd = 0;
            for(auto it=m.begin();it!=m.end();it++)
            {
                if(it->second&1==1)
                    odd++;
            }
             if(odd==0||(odd==1&&N&1==1))
                 ans++;
                 
        }
       
        return ans;
    }
};

4. 两个子序列的最大点积

leetcode周赛 (2020/05/24)_第4张图片

思路

dp[i][j]就是数组1前i个 数组2前j个的最大点积
dp[i][j] = max{nums1[i-1]*nums2[j-1], dp[i-1][j],dp[i][j-1],dp[i-1][j-1]+nums1[i-1]*nums2[j-1]}

代码

#define INF 0x3f3f3f3f;
class Solution {
public:
    int maxDotProduct(vector<int>& nums1, vector<int>& nums2) {
        int N = nums1.size();
        int M = nums2.size();
        vector<vector<int>> dp;
        dp.resize(N+1);
        for(int i=0;i<=N;i++)
            dp[i].resize(M+1);
        for(int i=0;i<=N;i++)
        {
            for(int j=0;j<=M;j++)
            {
                dp[i][j] = -INF;
            }
        }
        for(int i=1;i<=N;i++)
        {
            for(int j=1;j<=M;j++)
            {
                dp[i][j] = max(dp[i][j],nums1[i-1]*nums2[j-1]);
                dp[i][j] = max(max(dp[i][j],dp[i-1][j]),max(dp[i][j-1],dp[i-1][j-1]+nums1[i-1]*nums2[j-1]));
            }
        }
        return dp[N][M];
    }
};

你可能感兴趣的:(leetcode,leetcode周赛)