更多关于刷题的内容欢迎订阅我的专栏华为刷题笔记
该专栏题目包含两部分:
100 分值部分题目
200 分值部分题目
所有题目都会陆续更新,订阅防丢失
题目描述:
给定2个字符串 s 1 s1 s1 和 s 2 s2 s2 和正整数 k k k ,其中 s 1 s1 s1 长度为 n 1 n_1 n1, s 2 s2 s2 长度为 n 2 n_2 n2,在 s 2 s2 s2 中选一个子串,满足:
- 该子串长度为 n 1 + k n_1+k n1+k
- 该子串包含 s 1 s1 s1 中全部字母
- 该子串每个字母的出现次数不小于 s 1 s1 s1 中对应的字母
我们称s2以长度k冗余覆盖
s
1
s1
s1。给定
s
1
s1
s1、
s
2
s2
s2 和
k
k
k,求最左侧的
s
2
s2
s2 以长度
k
k
k冗余覆盖
s
1
s1
s1的子串的首个元素的下标,如果没有返回-1
举例:
s1=ab
s2=aabcd
k=1
则子串aab和abc均满足此条件,由于aab在abc的左侧,aab的第一个元素下标为0,因此输出0
输入描述
输入三行,第一行为
s
1
s1
s1,第二行为
s
2
s2
s2,第三行为
k
k
k
s
1
s1
s1 和
s
2
s2
s2 只包含小写字母
输出描述:
最左侧的
s
2
s2
s2 以长度
k
k
k 冗余覆盖
s
1
s1
s1 的子串首个元素的下标,如果没有返回-1
补充说明:
- 0 < = l e n ( s 1 ) < = 1000000 0 <= len(s1) <= 1000000 0<=len(s1)<=1000000
- 0 < = l e n ( s 2 ) < = 20000000 0 <= len(s2) <= 20000000 0<=len(s2)<=20000000
- 0 < = k < = 1000 0 <= k <= 1000 0<=k<=1000
示例1
输入:
ab
aabcd
1
输出:
0
说明:
子串aab和abc满足要求,由于aab在abc的左侧,因此输出aab的下下标:0
示例2
输入:
abc
dfs
10
输出:
-1
说明:
s2无法覆盖s1,输出-1
题解
统计第一个字符串每个字符出现的次数
利用滑动窗口统计第二个字符串
源码 Java
public class SubStringII {
static Input input;
static {
input = new Input("ab\n" +
"aabcd\n" +
"1") ;
input = new Input("abc\n" +
"dfs\n" +
"10");
}
public static void main(String[] args) {
String s1 = input.nextLine();
String s2 = input.nextLine();
int k = Integer.parseInt(input.nextLine());
int[] chacount = new int[128];
for (int i = 0; i < s1.length(); i++) {
chacount[s1.charAt(i)]++;
}
int[] windowcount = new int[128];
int left = 0;
int right = s1.length()+k;
if (s2.length() < s1.length()) {
System.out.println(-1);
return;
}
// init window
for (int i = 0; i < right && i < s2.length(); i++) {
windowcount[s2.charAt(i)]++;
}
if (isSame(chacount, windowcount)) {
System.out.println(-1);
return;
}
while (right < s2.length()) {
if (isSame(chacount, windowcount)) {
System.out.println(left);
return;
}
windowcount[s2.charAt(left)]--;
left++;
windowcount[s2.charAt(right)]++;
right++;
}
System.out.println(-1);
}
public static boolean isSame(int[] chacount, int[] windowcount) {
for (int i = 0; i < chacount.length; i++) {
if (windowcount[i] >= chacount[i]) {
continue;
}
return false;
}
return true;
}
}

73

被折叠的 条评论
为什么被折叠?



