题目链接:
将上述解决思路用代码实现如下:
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.push(i);
flag = s[i];
}
}
arr.forEach((data: number, index: number) => {
if (index === 0) {
arr_target.push(String(s.slice(0, data)));
// 分割数组只有一个元素情况下
if (arr.length === 1) arr_target.push(String(s.slice(data, s.length)));
} else if (index === arr.length - 1) {
arr_target.push(String(s.slice(arr[index - 1], data)));
arr_target.push(String(s.slice(data, s.length)));
} else {
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)
result += Math.min(
String(data).length,
String(arr_target[index + 1]).length
);
});
return result;
}
console.log(countBinarySubstrings("1100"));
function countBinarySubstrings(s: string): number {
let flag: string = s[0];
let arr: number[] = [];
let result: number = 0;
for (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"];
正则表达式太重要了!!
得到上述数组再进行数组内相邻元素比较元素字符串长度取小值,然后相加,类似上面方法即可。
评论区