题目描述
题目
给定一个字符串,其中只包含三种字符 c、o 和W,请统计COW在文本中出现了多少次。
COW中可以穿插字母,也就是说,只要三个字母按正确顺序出现即可。不同的COW也可以共享一些字母.
例如,COW在CWOW中出现1次,在CCOW中出现2次,在CCOOWW中出现8次。
输入
一串由c、o、w三个字母组成的字符
输出
一个数字,COW出现的次数
例子
输入: CCOOWW 输出: 8
解法
这里分享两种解法,直接上代码,第一种:
function cowTimes(str) {
// 字符串转为数组
const arr = str.split('');
// 存放O的位置
const OArr = [];
let result = 0;
// 遍历找出O的位置
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 'O') {
OArr.push(i);
}
}
// 遍历O数组
for (let i = 0; i < OArr.length; i++) {
let countC = 0;
let countW = 0;
// 取两端的C和W数量
for (let j = 0; j < arr.length; j++) {
if (arr[j] === 'C' && j < OArr[i]) {
countC++;
} else if (arr[j] === 'W' && j > OArr[i]) {
countW++;
}
}
// 计算当前O的结果
result += countC * countW;
}
return result;
}
代码中首先获取了字符串中所有O的位置并存入数组OArr中,之后遍历这个OArr,分别获取当前O两边的C和W数量,最后取乘积得到当前O能搭配的COW数量,复杂的为n*n。接下来是第二种:
function cowTimes(str) {
// 字符串转为数组
const arr = str.split('');
// 单次C出现的次数
let CCount = 0;
// CO组合的次数
let COCount = 0;
// COW组合的次数
let COWCount = 0;
for (let i = 0; i < arr.length; i++) {
if (arr[i] === 'C') {
CCount++;
} else if (arr[i] === 'O') {
COCount += CCount;
} else if (arr[i] === 'W') {
COWCount += COCount;
}
}
return COWCount;
}
可以看到,上述代码的复杂度为n,通过在一次循环中不断累加的方式得出了最终的结果。
结论
在实现项目需求的过程中,难免会涉及到一些算法来达成我们的目的,如果不是必要的话,我们应该尽量避免采用暴力的方式(也就是纯for循环,上述问题的暴力解法复杂度为n*n*n,这里不再列举)来解决当前问题,适当的思考会让我们的代码更加优秀哦。