1. 检查单词是否为句中其他单词的前缀
eazy题没什么好说的,暴力indexOf是否为0就可以,等于0出来就ok
public int isPrefixOfWord(String sentence, String searchWord) {
String[] words = sentence.split(" ");
int res=-1,index=1;
for(String s:words){
if(s.indexOf(searchWord)==0) return index;
index++;
}
return -1;
}
2. 定长子串中元音的最大数目
也是easy题,很简单的一个滑动窗口。
public int maxVowels(String s, int k) {
int res =0,left=0,right=0;int cur=0;
while(right<s.length()){
char c =s.charAt(right++);
if(c=='a'||c=='e'||c=='i'||c=='u'||c=='o') cur++;
if(right-left==k){
char a=s.charAt(left++);
res = Math.max(cur,res);
if(a=='a'||a=='e'||a=='i'||a=='u'||a=='o') cur--;
}
}
return res;
}
3.二叉树中的伪回文路径
伪回文的条件意思是至多只能有1个数字的频率为奇数(这种为奇数回文串,若没有则为偶数回文串),dfs加判断就可以了,关键是如何统计频率。我用了比较蠢的方法,比赛的时候没有想起来回溯。
public int res;
public int pseudoPalindromicPaths (TreeNode root) {
res=0;
dfs(root,0,"000000000");
return res;
}
public void dfs(TreeNode root,int depth,String s){
if(root==null) return;
StringBuilder r = new StringBuilder(s);
String next=new String();
if(s.charAt(root.val-1)=='1') {
r.setCharAt(root.val-1,'0');
next=r.toString();
}
else{
r.setCharAt(root.val-1,'1');
next=r.toString();
}
//System.out.println(next);
if(root.left==null&&root.right==null){
//System.out.println(next);
if(isValid(next)) res++;
return;
}
dfs(root.left,depth+1,next);
dfs(root.right,depth+1,next);
}
public boolean isValid(String s){
int one=0;
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='1') one++;
}
return one<=1;
}
4.两个子序列的最大点积
类似于最长公共子串的dp题(在群里大佬提示下解出来了这道题第一次ak),其中状态转移方程是:dp[i] [j] =
max(dp[i-1][j-1]+nums1[i]*nums2[j],dp[i-1] [j],dp[i][j-1],nums1[i]*nums2[j])
其中dp[i-1][j-1]+nums1[i]*nums2[j]选择(i,j)这一序列的数加入到结果中来,dp[i][j-1]和dp[i-1][j]则都无法选取,直接转移,最后这组数也可能成为最大值,对应处理全正数和全负数的特殊情况。`
public int maxDotProduct(int[] num1, int[] num2) {
int[][] dp = new int[num1.length + 1][num2.length + 1];
for(int i = 0 ; i < num1.length + 1 ; i ++){
for(int j = 0 ; j < num2.length + 1 ; j ++){
dp[i][j]= -100000000;
}
}
for(int i = 1 ; i < num1.length + 1 ; i ++){
for(int j = 1 ; j < num2.length + 1 ; j ++){
dp[i][j] = Math.max(num1[i-1]*num2[j-1],dp[i-1][j-1] + num1[i-1]*num2[j-1]);
dp[i][j] = Math.max(dp[i][j],Math.max(dp[i-1][j],dp[i][j-1]));
}
}
return dp[num1.length][num2.length];
}