5/23/20
第二次打周赛。全部通过AC。纪念一下。最后一题DP用的不是最优解,写了2次bug version。
可以去Github直接看我其他leetcode代码。
- Q1455_Check If a Word Occurs As a Prefix of Any Word in a Sentence
class Solution {
public int isPrefixOfWord(String sentence, String searchWord) {
sentence = sentence.trim();
if (sentence.isEmpty())
return -1;
String[] arr = sentence.split("\\s+");
for (int i = 0; i < arr.length; i++) {
if (arr[i].indexOf(searchWord) == 0)
return i+1;
}
return -1;
}
}
- Q1456_Maximum Number of Vowels in a Substring of Given Length
class Solution {
public int maxVowels(String s, int k) {
int n = s.length();
boolean[] isVow = new boolean[n];
int res = 0;
for (int i = 0; i < n; i++) {
if (s.charAt(i) == 'a' ||
s.charAt(i) == 'e' ||
s.charAt(i) == 'i' ||
s.charAt(i) == 'o' ||
s.charAt(i) == 'u')
isVow[i] = true;
if (i < k && isVow[i])
res++;
}
if (n < k)
return res;
int[] cnt = new int[n-k+1];
cnt[0] = res;
for (int i = 1; i < n-k+1; i++) {
cnt[i] = cnt[i-1];
if (isVow[i-1])
cnt[i]--;
if (isVow[i+k-1])
cnt[i]++;
if (cnt[i] > res)
res = cnt[i];
}
return res;
}
}
- Q1457_Pseudo-Palindromic Paths in a Binary Tree
class Solution {
int res = 0;
public int pseudoPalindromicPaths (TreeNode root) {
preOrder(root, new int[10]);
return res;
}
private void preOrder(TreeNode root, int[] cnt) {
if (root == null)
return;
int val = root.val;
cnt[val]++;
if (root.left == null && root.right == null) {
if (valid(cnt))
res++;
cnt[val]--;
return;
}
preOrder(root.left, cnt);
preOrder(root.right, cnt);
cnt[val]--;
}
private boolean valid(int[] cnt) {
int odd = 0;
for (int i = 1; i <= 9; i++) {
if (cnt[i] % 2 == 1)
odd++;
if (odd >= 2)
return false;
}
return true;
}
}
- Q1458_Max Dot Product of Two Subsequences
class Solution {
public int maxDotProduct(int[] nums1, int[] nums2) {
int res = Integer.MIN_VALUE;
int m = nums1.length;
int n = nums2.length;
int[][] prod = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
prod[i][j] = nums1[i] * nums2[j];
}
}
int len = Math.min(m, n);
// first i elements in nums1, first j elements in nums2, used elements: k
int[][][] dp = new int[m+1][n+1][len+1];
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++)
for (int k = 1; k <= len; k++)
dp[i][j][k] = Integer.MIN_VALUE;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 1; k <= Math.min(i,j); k++) {
if (i > 1)
dp[i][j][k] = Math.max(dp[i][j][k], dp[i-1][j][k]);
if (j > 1)
dp[i][j][k] = Math.max(dp[i][j][k], dp[i][j-1][k]);
dp[i][j][k] = Math.max(dp[i][j][k], dp[i-1][j-1][k-1] + prod[i-1][j-1]);
}
}
}
for (int k = 1; k <= len; k++)
res = Math.max(res, dp[m][n][k]);
return res;
}
}