【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript
【华为OD】2024年C、D卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript-CSDN博客
JS、C、Java、python、C++代码实现:
【华为OD】D卷真题100分:关联子串 JavaScript代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:关联子串 C语言代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:关联子串 java代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:关联子串 python代码实现[思路+代码]-CSDN博客
【华为OD】D卷真题100分:关联子串 C++代码实现[思路+代码]-CSDN博客
题目描述:
给定两个字符串str1和str2,如果字符串str1中的字符,经过排列组合后的字符串中,只要有一个字符串是str2的子串,则认为str1是str2的关联子串。
若str1是str2的关联子串,请返回子串在str2的起始位置;
若不是关联子串,则返回-1。
示例1:
输入:str1="abc",str2="efghicabiii"
输出:5
解释:str2包含str1的一种排列组合("cab"),此组合在str2的字符串起始位置为5(从0开始计数)
示例2:str1="abc",str2="efghicaibii"
输出:-1。
预制条件:
- 输入的字符串只包含小写字母;
- 两个字符串的长度范围[1, 100,000]之间
- 若str2中有多个str1的组合子串,请返回第一个子串的起始位置。
输入描述
输入两个字符串,分别为题目中描述的str1、str2。
输出描述
如果str1是str2的关联子串,则返回子串在str2中的起始位置。
如果str1不是str2的关联子串,则返回-1。
若str2中有多个str1的组合子串,请返回最小的起始位置。
示例1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
abc efghicabiii
输出
5
说明
str2包含str1的一种排列组合("cab"),此组合在str2的字符串起始位置为5(从0开始计数)
示例2
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
abc efghicaibii
输出
-1
说明
“abc”字符串中三个字母的各种组合(abc、acb、bac、bca、cab、cba),str2中均不包含,因此返回-1
备注
输入的字符串只包含小写字母;
两个字符串的长度范围[1, 100,000]之间
34334
+---+
3 | | ++ + +---|
| | | 3 + 6 + | + | +
| + | | + + + | + | +
| + | +---+ + + +++++ + + + | +
| + | + | + +----+ | | + + + | +
| + 3 | + | + + + 2 | | 2 + + + | +
| + | + | + + + | | + + + | +
| +---+ + | | | + ----+ | +---+ | | + | +
| | + | | | + | | | | | | + | +
| 1 | + | 8 | | + 1 | | | 1 | | 1 | | + | +
| | + | | | + | | | | | | | + | +
| +---+ + +---+ | ++---+ ++ +---+ +---+ | + | +
| | + | | | ++ | | |+ | +
|0 | + | 0 | 0 | ++ | 0 | |+ | +
| | + | | | ++ | | |+ | +
+---+ + +-------+ +---+| +|+ | +
+ + | +
0 1 2 3 4 5 6 7 8 9 10 11 12 + v: w u m u 1 0 2 4
题目解析:
使用哈希表配合滑动窗口来实现即可
代码实现:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split(" ");
HashMap<Character, Integer> data = new HashMap<>(), tmp = new HashMap<>();
for (int i = 0; i < s[0].length(); i++) {
if (!data.containsKey(s[0].charAt(i))) {
data.put(s[0].charAt(i), 1);
} else {
data.put(s[0].charAt(i), data.get(s[0].charAt(i)) + 1);
}
if (!tmp.containsKey(s[1].charAt(i))) {
tmp.put(s[1].charAt(i), 1);
} else {
tmp.put(s[1].charAt(i), tmp.get(s[1].charAt(i)) + 1);
}
}
if (data.equals(tmp)) {
System.out.println(0);
return;
}
for (int i = s[0].length(); i < s[1].length(); i++) {
if (!tmp.containsKey(s[1].charAt(i))) {
tmp.put(s[1].charAt(i), 1);
} else {
tmp.put(s[1].charAt(i), tmp.get(s[1].charAt(i)) + 1);
}
tmp.put(s[1].charAt(i - s[0].length()), tmp.get(s[1].charAt(i - s[0].length())) - 1);
if (tmp.get(s[1].charAt(i - s[0].length())) == 0) {
tmp.remove(s[1].charAt(i - s[0].length()));
}
if (tmp.equals(data)) {
System.out.println(i - s[0].length() + 1);
return;
}
}
System.out.println(-1);
return;
}
}