LeetCode 第 190 场周赛

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

eazy题没什么好说的,暴力indexOf是否为0就可以,等于0出来就ok

    public int isPrefixOfWord(String sentence, String searchWord) {
        String[] words = sentence.split(" ");
        int res=-1,index=1;
        for(String s:words){
            if(s.indexOf(searchWord)==0) return index;
            index++;
        }
        return -1;
    }

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

也是easy题,很简单的一个滑动窗口。

    public int maxVowels(String s, int k) {
        int res =0,left=0,right=0;int cur=0;
       	while(right<s.length()){
            
            char c =s.charAt(right++);
            if(c=='a'||c=='e'||c=='i'||c=='u'||c=='o') cur++;
            if(right-left==k){
                char a=s.charAt(left++);
                res = Math.max(cur,res);
                if(a=='a'||a=='e'||a=='i'||a=='u'||a=='o') cur--;
                
            }
           
        }
        return res;

    }

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

伪回文的条件意思是至多只能有1个数字的频率为奇数(这种为奇数回文串,若没有则为偶数回文串),dfs加判断就可以了,关键是如何统计频率。我用了比较蠢的方法,比赛的时候没有想起来回溯。

    public int res;
    public int pseudoPalindromicPaths (TreeNode root) {
        res=0;   
        dfs(root,0,"000000000");
        return res;
    }
    public void dfs(TreeNode root,int depth,String s){
        if(root==null) return;

        StringBuilder r = new StringBuilder(s);
        String next=new String();
        if(s.charAt(root.val-1)=='1') {           
            r.setCharAt(root.val-1,'0'); 
            next=r.toString();
        }
        else{
            r.setCharAt(root.val-1,'1'); 
            next=r.toString(); 
        }    
        //System.out.println(next);  
        if(root.left==null&&root.right==null){    
            //System.out.println(next);       
            if(isValid(next)) res++;
            return;
        }
        dfs(root.left,depth+1,next);
        dfs(root.right,depth+1,next);
    }
    public boolean isValid(String s){
        int one=0;
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)=='1') one++;
        }
        return one<=1;
        
    }

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

类似于最长公共子串的dp题(在群里大佬提示下解出来了这道题第一次ak),其中状态转移方程是:dp[i] [j] =
max(dp[i-1][j-1]+nums1[i]*nums2[j],dp[i-1] [j],dp[i][j-1],nums1[i]*nums2[j])
其中dp[i-1][j-1]+nums1[i]*nums2[j]选择(i,j)这一序列的数加入到结果中来,dp[i][j-1]和dp[i-1][j]则都无法选取,直接转移,最后这组数也可能成为最大值,对应处理全正数和全负数的特殊情况。`

    public int maxDotProduct(int[] num1, int[] num2) {
        int[][] dp = new int[num1.length + 1][num2.length + 1];
        for(int i = 0 ; i < num1.length + 1 ; i ++){
            for(int j = 0 ; j < num2.length + 1 ; j ++){
                dp[i][j]= -100000000;
            }                
        }
        for(int i = 1 ; i < num1.length + 1 ; i ++){
            for(int j = 1 ; j < num2.length + 1 ; j ++){
                
                dp[i][j] = Math.max(num1[i-1]*num2[j-1],dp[i-1][j-1] + num1[i-1]*num2[j-1]);
                dp[i][j] = Math.max(dp[i][j],Math.max(dp[i-1][j],dp[i][j-1]));
                
                
            }
        }
        return dp[num1.length][num2.length];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值