题目链接:

  • https://leetcode-cn.com/problems/count-binary-substrings/

    解决思路

  • 数学规律就是将字符串按照一整个0或1切割开来,将其放入数组arr,然后arr中相邻的元素(字符串)进行字符串长度比较大小,取小的,最后所有相邻的元素比较后的所有相加就是所需结果

  • 将字符串按照一整个0或1切割开来:先对字符串遍历,找到异元素,记录其下标,存为数组arr;然后利用splice方法+arr数组进行切割为目标数组

    代码实现

    将上述解决思路用代码实现如下: ```typescript function countBinarySubstrings(s: string): number { let flag: string = s[0] let arr: number[] = [] let arr_target: string[] = [] for (let i: number = 0; i < s.length; i++) { if (s[i] !== flag) {
    1. arr.push(i)
    2. flag = s[i]
    } } arr.forEach((data: number, index: number) => { if (index === 0) {
    1. arr_target.push(String(s.slice(0, data)))
    2. // 分割数组只有一个元素情况下
    3. if (arr.length === 1) arr_target.push(String(s.slice(data, s.length)))
    } else if (index === arr.length - 1) {
    1. arr_target.push(String(s.slice(arr[index - 1], data)))
    2. arr_target.push(String(s.slice(data, s.length)))
    } else {
    1. arr_target.push(String(s.slice(arr[index - 1], data)))
    } }) let result: number = 0 arr_target.forEach((data: string, index: number) => { if (index < arr_target.length - 1)
    1. result += Math.min(
    2. String(data).length,
    3. String(arr_target[index + 1]).length
    4. )
    }) return result }

console.log(countBinarySubstrings(‘1100’))

  1. - **对上述逻辑的小优化**:上面是利用arr还转换为原只含01的数组,但是可以利用arr直接进行求算结果
  2. ```typescript
  3. function countBinarySubstrings(s: string): number {
  4. let flag: string = s[0]
  5. let arr: number[] = []
  6. let result: number = 0
  7. for (let i: number = 0; i < s.length; i++) {
  8. if (s[i] !== flag) {
  9. arr.push(i)
  10. flag = s[i]
  11. }
  12. }
  13. arr.forEach((data: number, index: number) => {
  14. if (index === 0) {
  15. arr.length === 1
  16. ? (result += Math.min(data, s.length - data))
  17. : (result += Math.min(data, arr[index + 1] - data))
  18. } else if (index === arr.length - 1) {
  19. result += Math.min(data - arr[index - 1], s.length - data)
  20. } else {
  21. result += Math.min(arr[index + 1] - data, data - arr[index - 1])
  22. }
  23. })
  24. return result
  25. }

最后优化效果如下
image.png

优化方案

在官网解决方案中,看到其他的解决方案:

利用正则表达式来切换原字符串

  1. s.match(/([1]+)|([0]+)/g)

上面的正则表达式就能实现如下效果…………

  1. [ '00', '11', '00', '11' ]

696. 计数二进制子串🔖字符串 - 图2正则表达式太重要了!!
得到上述数组再进行数组内相邻元素比较元素字符串长度取小值,然后相加,类似上面方法即可。