题目链接:
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) {
} } arr.forEach((data: number, index: number) => { if (index === 0) {arr.push(i)flag = s[i]
} else if (index === arr.length - 1) {arr_target.push(String(s.slice(0, data)))// 分割数组只有一个元素情况下if (arr.length === 1) arr_target.push(String(s.slice(data, s.length)))
} else {arr_target.push(String(s.slice(arr[index - 1], data)))arr_target.push(String(s.slice(data, s.length)))
} }) let result: number = 0 arr_target.forEach((data: string, index: number) => { if (index < arr_target.length - 1)arr_target.push(String(s.slice(arr[index - 1], data)))
}) return result }result += Math.min(String(data).length,String(arr_target[index + 1]).length)
console.log(countBinarySubstrings(‘1100’))
- **对上述逻辑的小优化**:上面是利用arr还转换为原只含0、1的数组,但是可以利用arr直接进行求算结果```typescriptfunction countBinarySubstrings(s: string): number {let flag: string = s[0]let arr: number[] = []let result: number = 0for (let i: number = 0; i < s.length; i++) {if (s[i] !== flag) {arr.push(i)flag = s[i]}}arr.forEach((data: number, index: number) => {if (index === 0) {arr.length === 1? (result += Math.min(data, s.length - data)): (result += Math.min(data, arr[index + 1] - data))} else if (index === arr.length - 1) {result += Math.min(data - arr[index - 1], s.length - data)} else {result += Math.min(arr[index + 1] - data, data - arr[index - 1])}})return result}
优化方案
利用正则表达式来切换原字符串
s.match(/([1]+)|([0]+)/g)
上面的正则表达式就能实现如下效果…………
[ '00', '11', '00', '11' ]
正则表达式太重要了!!
得到上述数组再进行数组内相邻元素比较元素字符串长度取小值,然后相加,类似上面方法即可。
