检查单词是否为句中其他单词的前缀 | 定长子串中元音的最大数目 | 二叉树中的伪回文路径 | 两个子序列的最大点积 |
---|---|---|---|
3分 简单 | 4分 中等 | 5分 中等 | 6分 困难 |
1455 数组中两元素的最大乘积
解题思路:
以空格分割字符串,seartchword跟每个字符串作比较,匹配了直接返回
index记录现在是第几个字符串
复杂度:
遍历了字符串sentence一遍,故为O(n)
class Solution { public: int isPrefixOfWord(string sentence, string searchWord) { int len=sentence.length(); int index=1,now=0; int n=searchWord.length(); for(int i=0;i<len;i++){ while(sentence[i]!=' '&&i<len){ if(sentence[i]==searchWord[now]){ now++; if(now==n) return index; } else{ while(sentence[i]!=' '&&i<len) i++; break; } i++; } now=0; index++; } return -1; } };
1456 定长子串中元音的最大数目
解题思路:
维护长度为k的滑动窗口即可,now记录当前滑动窗口的元音数,每次更新最大值ans
复杂度:
O(n)
class Solution { public: int a[26]; int maxVowels(string s, int k) { int n=s.length(); string tmp="aeiou"; for(auto it:tmp) a[it-'a']=1; int ans=0,now=0; for(int i=0;i<k;i++){ if(a[s[i]-'a']){ now++; } } ans=max(ans,now); for(int i=k;i<n;i++){ if(a[s[i]-'a']){ now++; } if(a[s[i-k]-'a']){ now--; } ans=max(ans,now); } return ans; } };
1457 二叉树中的伪回文路径
解题思路:
题意是让你求从根节点到叶子节点的伪回文路径数目,伪回文路径表示这条路径经过的节点重新排序后可以形成一个回文序列
那么,题意就转化为了这条路径中个数为奇数的值是否小于1,小于1的话可以构成回文序列
dfs遍历即可,还要维护1-9的值的个数(vector<int>num)
class Solution { public: int ans=0; void dfs(TreeNode* root,vector<int>num){ num[root->val]++; if(root->left==NULL&&root->right==NULL){ int odd=0,even=0; for(auto it:num){ if(it&1) odd++; else even++; } if(odd<=1){ ans++; } return ; } if(root->left!=NULL) dfs(root->left,num); if(root->right!=NULL) dfs(root->right,num); } int pseudoPalindromicPaths (TreeNode* root) { if(root==NULL) return 0; vector<int>num(10,0); ans=0; dfs(root,num); return ans; } };
1458 两个子序列的最大点积
解题思路:
dp
dp[i][j]表示nums1中前i个,nums2中前j个中非空子序列的最大点积 转移方程 dp[i][j]=max(dp[i-1][j],max(0,dp[i-1][j-1])+nums1[i-1]*nums2[j-1]); 如果选了nums1[i-1],nums2[j-1]作为最新的非空子序列的下一个点积,肯定要选择之前的最大点积状态 dp[i-1][j-1],或者0(之前的最大点积状态值为负,可以都不选) dp[i][j]=max(dp[i][j],dp[i][j-1]); 表示nums[i]和nums[jj]点积更大(jj<j) 另外要把其他状态赋值为最小值,因为子序列是非空的,如果最大点积仍然小于0,若不赋为最小值,答案可能为0,不符合条件
复杂度:
O(n*m)
class Solution { public: int dp[505][505]; int maxDotProduct(vector<int>& nums1, vector<int>& nums2) { int n=nums1.size(); int m=nums2.size(); for(int i=0;i<=m;i++) dp[0][i]=-1000000000; for(int i=1;i<=n;i++){ dp[i][0]=-1000000000; for(int j=1;j<=m;j++){ dp[i][j]=max(dp[i-1][j],max(0,dp[i-1][j-1])+nums1[i-1]*nums2[j-1]); dp[i][j]=max(dp[i][j],dp[i][j-1]); } } return dp[n][m]; } };