字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位§,第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
题解如下:
25/25
这题最开始的思路是三重for循环,就挨个找这个字母后面有几个对应的字母,跑了一下后3个case超时,就优化了一下代码改成了双重for循环,但是还是超时
看了一下网上的思路,发现找出每个A前面的P的数量和后面的T的数量然后相乘就好了
然后又开始捣鼓,想着用findIndex
和findLastIndex
分别计算出字母数量,但是findLastIndex
会报错findLastIndex is not a function
,查文档得知:我用的node进行编译,但是这个方法对node版本要求比较高,得18.0.0以上,而pat的node版本也才12。又get了新知识捏
但是其实就算是findIndex
也行不通,还是超时,我猜这一类方法的底层实现应该都是遍历,会导致时间复杂度比较高
因此还是学习了网上的方法,我真的蛮笨的,咋就想不出来呢?
以上都是废话,正文如下:
/**
* 2024/03/18
* 25/25
*/
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", function (data) {
console.log(deal(data));
});
function deal(data) {
let num = 0;
// findLastIndex方法对node版本要求必须是18.0.0以上,否则会报错
// 所以就换成findIndex找到第一个比A大的索引,该索引前面的所有都是比A小的索引了,不过find系列的方法的底层实现原理好像都是遍历,时间复杂度会过大无法通过
// 统计字母T的数量
let TNum = 0;
let PNum = 0;
for (let i = 0; i < data.length; i++) {
if (data[i] === "T") {
TNum++;
}
}
for (let i = 0; i < data.length; i++) {
let el = data[i];
if (el === "P") {
PNum++;
} else if (el === "T") {
TNum--;
} else {
num += (PNum * TNum) % 1000000007;
}
}
return num % 1000000007;
}