纪念第一次"AK"(12:02 AK。。。最后一题太蠢了 这么简单个动态规划,找bug找了很久)
leetcode最近周赛好像越来越简单了啊,最后一题的动态规划也不难。
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. 定长子串中元音的最大数目
代码
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. 二叉树中的伪回文路径
代码
/**
* 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. 两个子序列的最大点积
思路
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];
}
};