直接模拟就好了
class Solution { public: int isPrefixOfWord(string sentence, string searchWord) { int ans = 1; for(int j = 0; j < searchWord.size(); ++j) { if(sentence[j] != searchWord[j]) { break; } cout << j << endl; if(j == searchWord.size() - 1) { return ans; } } for(int i = 0; i < sentence.size(); i++) { if(sentence[i] == ' ') { ans++; for(int j = 0; j < searchWord.size(); ++j) { if(sentence[i + j + 1] != searchWord[j]) { break; } cout << j << endl; if(j == searchWord.size() - 1) { return ans; } } } } return -1; } };
利用前缀和求解(SB题 数据规模不只有1e5 题目要求出现问题==一直wa)
class Solution { public: int maxVowels(string s, int k) { for(int i = 0; i < 100005; ++i) { a[i] = 0; } for(int i = 0; i < s.size(); ++i) { if(s[i] == 'a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'o' || s[i] == 'u') { a[i + 1]++; } a[i + 1] += a[i]; } int ans = 0; for(int i = 0; i <= s.size(); i ++) { ans = max(ans, a[i + k] - a[i]); } return ans; } private: int a[1000050]; };
DFS遍历二叉树,用数组进行记录,最后如果数字为奇数个的数目不超过1一个则是一种方案ans++。利用DFS进行回溯算法进行遍历,每次遍历到叶子节点进行判定。
/** * 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 ans = 0; int pseudoPalindromicPaths (TreeNode* root) { for(int i = 0; i < 10; ++i) { sb[i] = 0; } DFSS(root); return ans; } bool j(){ int __ = 0; for(int i = 1; i < 10; i++) { if(sb[i] & 1 == 1) { __++; } if(__ > 1) { return 0; } } return 1; } void DFSS(TreeNode* root){ sb[root -> val]++; if(root -> left || root -> right){ if(root -> left) DFSS(root -> left); if(root -> right) DFSS(root -> right); } else if(j()) ans++; sb[root->val]--; } private: int sb[10]; };
一道很好的二维dp问题。关键在于找出状态转移方程:dp[i][j]代表nums1前i个和nums2前j的最优解。状态转移为一下五类的最大值 1.第i-1和第j-1个数相乘 2.第i-1和第j-1个数相乘+dp[i-1][j-1] 3.dp[i-1][j] 4.dp[i][j-1] 5.dp[i-1][j-1]。注意初始化为最小负数 最终结果为负数的情况会出错。
class Solution { public: int dp[510][510]; int maxDotProduct(vector<int>& nums1, vector<int>& nums2) { memset(dp, -0x3f3f3f3f, sizeof dp); // dp[1][1] = nums1[0] * nums2[0]; for(int i = 1; i <= nums1.size(); ++i) { for(int j = 1; j <= nums2.size(); ++j) { dp[i][j] = nums1[i - 1] * nums2[j - 1]; dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + dp[i][j]); dp[i][j] = max(dp[i][j], dp[i - 1][j]); dp[i][j] = max(dp[i][j], dp[i][j - 1]); dp[i][j] = max(dp[i][j], dp[i - 1][j - 1]); } } return dp[nums1.size()][nums2.size()]; } };