第 190 场力扣周赛

2020-05-24

5416. 检查单词是否为句中其他单词的前缀
注意这里的前缀是指单词的开始,我们首先找到单词的开始,然后判断其长度为searchword的子串是否等于searchword即可。
class Solution {
public:
    int isPrefixOfWord(string sentence, string searchWord) {
        int l1=sentence.length();
        int l2=searchWord.length();
        if (!l1||!l2) return 0; // 特殊情况判断
        int word=1;
        for (int i=0;i<=l1-l2;i++){
            if ((i==0&&sentence[i]!=' ')||(i-1>0&&sentence[i-1]==' '&&sentence[i]!=' ')){
                // 找到单词的开始
                if (sentence.substr(i,l2)==searchWord){
                    return word;
                }
                word++;
            }
        }
        return -1;
    }
};
5417. 定长子串中元音的最大数目
1.暴力判断,时间复杂度为O(s.length()*k),超时
2.使用滑动窗口即可
class Solution {
public:
    int maxVowels(string s, int k) {
        int l=s.length();
        if (!l) return 0;
        int res=0;
        int cnt=0;
        vector<bool>vec(l,false); // 存放是不是元音字母
        for (int i=0;i<l;i++){
            if (s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u'){   
                vec[i]=true;
            }
        }
        queue<int> myque;
        for (int i=0;i<k;i++){
            if (vec[i]) cnt++;
        }
        if (cnt==k) return k;
        res=cnt;
        for (int i=k;i<l;i++){
            if (vec[i]) cnt++;
            if (vec[i-k]) cnt--;
            res=max(res,cnt);
            if (res>=k) return k;
        }
        if (res>=k) return k;
        return res;
    }
};
5418. 二叉树中的伪回文路径
使用深度优先搜索即可,到叶子节点的时候判断是否是伪回文路径,由于数字范围是0-9,
1. 可以使用vector存放当前路径上的数值,到叶子节点时判断vector中是否最多只有一个数值出现一次,可以用 map存放其出现的次数。
2. 使用异或操作,异或操作就是相同为0,不同为1,且n&(n-1)可以消除n二进制表示的最后一个1,由于数字范围为0-9,我们可以将当前数表示为第几个二进制位上值为1,比如3:1000,如果所有的数出现的次数是偶数次,那么其异或的结果为0,如果只有一个数出现的次数为奇数次,那么其异或的结果*(其结果-1)就表示把其中的一个1消除了。
/**
 * 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:
    int res=0;
    int pseudoPalindromicPaths (TreeNode* root) {
        if (!root) return 0;
        dfs(root,0);
        return res;
    }

    void dfs(TreeNode* t,int value){
        value^=(1<<t->val);
        if (!t->left&&!t->right){ // 如果是叶子节点
            if (!value||!(value&(value-1))) res++;
        }
        if (t->left) dfs(t->left,value);
        if (t->right) dfs(t->right,value);
    }
};
5419. 两个子序列的最大点积
使用动态规划即可,太久没有写,都快生疏了...
class Solution {
public:
    int maxDotProduct(vector<int>& nums1, vector<int>& nums2) {
        int l1=nums1.size();
        int l2=nums2.size();
        vector<vector<int>> dp(l1+1,vector<int>(l2+1,-100000*500));
        for (int i=1;i<=l1;i++){
            for (int j=1;j<=l2;j++){
                int a=nums1[i-1];
                int b=nums2[j-1];
                dp[i][j]=a*b;
                dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a*b);
                dp[i][j]=max(dp[i][j],dp[i-1][j-1]);
                dp[i][j]=max(dp[i][j],dp[i-1][j]);
                dp[i][j]=max(dp[i][j],dp[i][j-1]);
            }
        }
        return dp[l1][l2];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值