码迷,mamicode.com
首页 > 其他好文 > 详细

竞赛197

时间:2020-07-12 17:17:59      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:一个   tle   规律   bst   foreach   tps   提高   function   tco   

仅含 1 的子串数

 

给你一个二进制字符串 s(仅由 ‘0‘ 和 ‘1‘ 组成的字符串)。

返回所有字符都为 1 的子字符串的数目。

由于答案可能很大,请你将它对 10^9 + 7 取模后返回。

 

示例 1:

输入:s = "0110111"
输出:9
解释:共有 9 个子字符串仅由 ‘1‘ 组成
"1" -> 5 次
"11" -> 3 次
"111" -> 1 次
示例 2:

输入:s = "101"
输出:2
解释:子字符串 "1" 在 s 中共出现 2 次
示例 3:

输入:s = "111111"
输出:21
解释:每个子字符串都仅由 ‘1‘ 组成
示例 4:

输入:s = "000"
输出:0
 

提示:

s[i] == ‘0‘ 或 s[i] == ‘1‘
1 <= s.length <= 10^5

/**
 * @param {string} s
 * @return {number}
 */
var numSub = function(s) {
    // let len = s.length;
    let arr = s.split(‘0‘).filter(f=>f)
    let r = 0;
    arr.forEach(a=>{
        let len = a.length;
        r+=len*(1+len)/2
        r = r%(10**9+7)
        // for(let i=0; i<len; i++){
        //     for(let j=i+1; j<=len; j++){
        //         // let sub = s.slice(i, j)
        //         // console.log(sub)
        //         // if(sub.indexOf(‘0‘)>=0){
        //             // continue
        //         // } else {
        //             r = r%(10**9+7)
        //             r++
        //         // }
        //     }
        // }
    })
    
    return r
    
};

 总结:最后差点没做出了,提高200名次,偶然间百度出有这么个规律。

双层for循环不管怎么整,都会有测试用例不通过。规律就是

“1” 的子串数是: 1*(1+1)/2

"11" 的子串数是:2*(1+2)/2

"111"的子串数是: 3*(1+3)/2

....

所以关系式是个等差数列公式

 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-substrings-with-only-1s
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

竞赛197

标签:一个   tle   规律   bst   foreach   tps   提高   function   tco   

原文地址:https://www.cnblogs.com/zhangzs000/p/13288498.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!