【华为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
题目解析:
使用哈希表配合滑动窗口来实现即可
代码实现:
const readline = async () => (await iter.next()).value;
const rl = require("readline").createInterface({ input: process.stdin });
const iter = rl[Symbol.asyncIterator]();
function findPos(src1, src2) {
const chCnt1 = new Map();
let res = -1;
for (let c of src1) {
chCnt1.set(c, (chCnt1.get(c) || 0) + 1);
}
const n1 = src1.length;
const n2 = src2.length;
let index = 0;
while (index + n1 <= n2) {
const chCnt2 = new Map();
for (let i = index; i < index + n1; i++) {
chCnt2.set(src2[i], (chCnt2.get(src2[i]) || 0) + 1);
}
let check = 1;
for (let [key, value] of chCnt1) {
if (chCnt2.get(key) !== value) {
check = 0;
break;
}
}
if (check === 1) {
res = index;
break;
}
index++;
}
return res;
}
readline().then((input) => {
const [src1, src2] = input.trim().split(' ');
console.log(findPos(src1, src2));
rl.close();
});