目录
一、最小覆盖子串
题目
给定一个定长的字符串,其中包含若干字符,求该字符串中一个连续子串,满足两个条件:
1. 子串包含该字符串中的所有不同的字符
2. 满足条件1中最短的一个(若有多个,则找从左到右第一个出现的子串)
输出用子串的起始下标与长度来表示
输入
输入一个字符串(如abbbaaccb),字符串长度[ 1, 65535],字符集为单字节ascii码集合
输出
返回最短包含全集的子串,用(起始下标,长度)二元组表示。如果结果不唯一,返回第一个找到的结果。
上述例子中,候选有两个,即abb“baac”cb与abbba“accb”,返回第一个的子串,表示为( 3, 4)
方法:滑动窗口
import java.util.*;
import java.util.HashMap;
public class Solution {
public String minWindow (String S, String T) {
// write code here
HashMap<Character,Integer> need = new HashMap<>();//目标字符需要的次数
HashMap<Character,Integer> window = new HashMap<>();//窗口出现字符的次数
for(int i = 0;i < T.length();i++){
need.put(T.charAt(i),need.getOrDefault(T.charAt(i),0) + 1);//统计目标字符出现的次数
}
int left = 0,right = 0,flag = 0,minlen = Integer.MAX_VALUE,start = 0;
while(right < S.length()){
char c = S.charAt(right);
right++;
if(need.containsKey(c)){//当右滑元素包括目标字符时
window.put(c,window.getOrDefault(c,0) + 1);//窗口的目标字符出现次数加1
if(need.get(c) == window.get(c)){//如果该字符出现次数达到了目标次数
flag++;//增加字符成功的次数
}
}
while(flag == need.size()){//如果所有字符都满足了条件,开始左滑
if(right - left < minlen){//如果当前长度小于最小长度,记录当前的值
start = left;//开始下标
minlen = right - left;//最小长度
}
char d = S.charAt(left);//左滑
left++;
if(need.containsKey(d)){//如果当前左滑的元素为目标字符
if(need.get(d) == window.get(d)){//且次数刚好满足,则满足字符数量减1
flag--;
}
window.put(d,window.getOrDefault(d,0) - 1);//目标字符出现次数减1
}
}
}
return minlen == Integer.MAX_VALUE ? "" : S.substring(start,start + minlen);
}
}
运行时间和空间消耗,
二、下象棋(待做)
题目
小A和小B在下象棋,经过激烈的对局,两人都只剩下了将和一匹马。此时小A提议,如果小B能计算出在小A不移动棋子且小B的马只能朝右上方移动的情况下,小B的马从原点出发能够顺利取胜的路径数(吃掉小A的将,且在移动的过程中不被小A的马攻击),那么就算小B赢的对局。聪明的你能帮小B赢得对局吗?
马行动的规则:马走日,一直一斜。即马每次行动需进行两个步骤,首先向右或向上移动一格(一直),再沿原移动方向倾斜45度的对角线跳动一次(一斜)。例如,假设马的位置为( 0, 0),那么马行动一次可以移动到( 1, 2)或( 2, 1)。但是,马在直线移动后不能落在一个已有棋子的位置上,否则马将无法沿对角线跳跃。即,当马的位置在( 0, 0),且( 1, 0)位置有棋子时,马不能到达( 2, 1),但可到达( 1, 2)。
输入
输入四个整数,前两个数表示小A的马的坐标,后两个数表示小A的将的坐标
输出
输出一个整数,表示能够取胜的路径个数
三、定制文化衫(待做)
题目
某公司想在10月24日为每个人定制一件文化衫。文化衫有D、E、F三种款式,
D[i] 表示编号为 i 的员工收到 D 款式的文化衫时的快乐值,
E[i] 表示编号为 i 的员工收到 E 款式的文化衫时的快乐值,
F[i] 表示编号为 i 的员工收到 F 款式的文化衫时的快乐值,
没有人愿意和自己的直系领导撞衫,
求所有人收到文化衫时的快乐值总和的最大值,
输入
共有 2 N 行,
第 1 行是公司的总人数 N( 2 <= N <= 5000),
第 2 行到第 N + 1 行描述了员工的快乐值,第 i + 2 行是三个空格分隔的整数: D[i]( 0 <= D[i] <= 100)、 E[i]( 0 <= E[i] <= 100)、 F[i]( 0 <= F[i] <= 100) 表示编号为 i 的员工收到文化衫时的快乐值。最大的领导的编号为 0,
第 N + 2 行到第 2 N 行描述了公司的上下级关系,每行有两个空格分隔的整数:A 和 B,表示 A 是 B 直系领导。除大领导之外,每个员工有且只有一个直系领导。
输出
一个整数,快乐值总和的最大值。