算法题分享之COW数量

161 阅读2分钟

题目描述

题目

给定一个字符串,其中只包含三种字符 c、o 和W,请统计COW在文本中出现了多少次。
COW中可以穿插字母,也就是说,只要三个字母按正确顺序出现即可。不同的COW也可以共享一些字母.
例如,COWCWOW中出现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两边的CW数量,最后取乘积得到当前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,这里不再列举)来解决当前问题,适当的思考会让我们的代码更加优秀哦。