题解 | #游游的好串#

游游的好串

http://www.nowcoder.com/questionTerminal/7aad9d56acca40d9a7eb64cf6ca3cc0c

核心思路:一个好串的所有前缀串都是好串 比如 0010,它的所有前缀 0、00、001、0010都是好串
所以我们要找计算从i开始的所有最长好串的长度,然后求和就是结果(注意结果要开long)
类似括号匹配,但这里是0的数量大于1的数量(左括号的数量大于右括号的数量)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        int n = s.length();
        long res = 0;
        // 维护一个栈,记录字符串中1出现的位置,当有0时则弹出1
        Deque<Integer> st = new ArrayDeque<>();
        // ans[i]表示以i为开头最长好串的长度
        int[] ans = new int[n];
        for(int i = n - 1; i >= 0; i--) {
            if(s.charAt(i) == '1') {
                st.push(i);
            } else {
                // 一个好串它的所有前缀(下标0开始的子串)也都是好串
                ans[i] = st.isEmpty() ? n - i : st.pop() - i;
                res += ans[i];
            }
        }
        System.out.println(res);
    }
}


全部评论

相关推荐

04-02 16:49
门头沟学院 Java
_bloodstream_:我也面了科大讯飞,主管面的时候听说急招人优先考虑能尽快实习的,我说忙毕设,后面就一直没消息了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务