第 190 场力扣周赛题解

气死了,4个辣鸡题。本来这场能冲一波前十名的,结果最后一题打错了个变量,直接wa了五发爆炸。真的菜 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

第 190 场力扣周赛题解_第1张图片

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

题目链接:https://leetcode-cn.com/contest/weekly-contest-190/problems/check-if-a-word-occurs-as-a-prefix-of-any-word-in-a-sentence/

思路:先将句子分离,之后挨个判断即可。

class Solution {
    public int isPrefixOfWord(String sentence, String searchWord) {
    	
    	String[] str=sentence.split(" ");
    	
    	for(int i=0;i=searchWord.length() && str[i].substring(0, searchWord.length()).equals(searchWord))
    			return i+1;
    	}
    	
    	return -1;
    }
}

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

题目链接:https://leetcode-cn.com/contest/weekly-contest-190/problems/maximum-number-of-vowels-in-a-substring-of-given-length/

思路:简单尺取法判断长度为k的子串原因个数即可。

class Solution {
    public int maxVowels(String s, int k) {
    	
    	int ans=0,num=0;
    	for(int i=0;i

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

题目链接:https://leetcode-cn.com/contest/weekly-contest-190/problems/pseudo-palindromic-paths-in-a-binary-tree/

思路:若某条路径可以组成回文串,则这条路径上最多只有一个数出现奇数次,因此我们用set存一下信息即可。

class Solution {
	
	private int ans;
	private Set st;
	
    public int pseudoPalindromicPaths (TreeNode root) {
        
    	ans=0;
    	st=new HashSet<>();
    	
    	dfs(root);
    	
    	return ans;
    }
    
    private void dfs(TreeNode root) {
    	if(root==null) return;
    	
    	boolean mark=false;
    	
    	//System.out.println(root.val+" "+st.size());
    	if(!st.contains(root.val)) {
    		st.add(root.val);
    		mark=true;
    	}
    	else
    		st.remove(root.val);
    	
    	if(root.left==null && root.right==null) {
    		//System.out.println(root.val+" "+st.size());
    		if(st.size()<=1)
    			ans++;
    	}
    	
    	dfs(root.left);
    	dfs(root.right);
    	
    	if(mark)
    		st.remove(root.val);
    	else
    		st.add(root.val);
    }
}

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

题目链接:https://leetcode-cn.com/contest/weekly-contest-190/problems/max-dot-product-of-two-subsequences/

思路:定义dp[i][j]表示第一个串到第i个字符,第二个串到第j个字符能组成的最大点积和,其中转移方程和两个字符串最长相等子序列的转移方程类似。这题的唯一坑点就是我们要至少每个串里拿一个字符,因此在输出时需要主要,要是你最后得到的答案是0,则很可能你一个都没取,简单的判断下就ok!

class Solution {
    public int maxDotProduct(int[] nums1, int[] nums2) {
    	
    	int mx=Integer.MIN_VALUE;
    	int m=nums1.length;
    	int n=nums2.length;
    	int[][] dp=new int[m+1][n+1];
    	
    	for(int i=1;i<=m;i++)
    		for(int j=1;j<=n;j++) {
    			dp[i][j]=-500000000;
    			mx=Math.max(mx, nums1[i-1]*nums2[j-1]);
    		}
    	
    	for(int i=1;i<=m;i++)
    		for(int j=1;j<=n;j++) {
    			dp[i][j]=Math.max(dp[i-1][j-1]+nums1[i-1]*nums2[j-1], Math.max(dp[i][j-1], dp[i-1][j]));
    			//System.out.println(dp[i][j]);
    		}
    	
    	int ans=Integer.MIN_VALUE;
    	for(int i=1;i<=m;i++)
    		for(int j=1;j<=n;j++)
    			ans=Math.max(ans, dp[i][j]);
    	
    	return ans==0?mx:ans;
    }
}

 

你可能感兴趣的:(第 190 场力扣周赛题解)