1573. Number of Ways to Split a String

96 阅读1分钟

image.png

image.png

方法

  • 如果 m 不是 3 的倍数,则不存在符合题目要求的分割 s 的方案,因此返回 0
  • 如果 m=0,则字符串 s 中的所有字符都为 0,因此可以在 s 的内部的任何位置进行分割。由于 s 的长度为 n,因此有 n−1 个分割位置,选择 2 个不同的分割位置即可将 s 分成 3 个非空子字符串
  • 如果 m>0 ,则每个子字符串都包含 m/3 个字符 1,注意两段位置有多少个空槽可以分割,乘起来
class Solution {
    public int numWays(String s) {
        int n = s.length();
        // 记录1出现的index
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            if (s.charAt(i) == '1') {
                list.add(i);
            }
        }
        // k 为 有多少个 1
        int k = list.size();
        // 如果 1 的个数 不是 3的倍数,无法分
        if (k % 3 != 0) {
            return 0;
        }
        // 如果没有1,直接分,C(n-1, 2)
        if (k == 0) {
            return (n - 1) * (n - 2) / 2;
        }
        
        // ___1_11__|______111__|___11__1____
        //       ^         ^ ^      ^
        //.      1.        2 3.     4
        int idx1 = list.get(k / 3 - 1);
        int idx2 = list.get(k / 3);
        int idx3 = list.get(k / 3 + k / 3 - 1);
        int idx4 = list.get(k / 3 + k / 3);

        int slot1 = idx2 - idx1; // 第一段有多少个空
        int slot2 = idx4 - idx3; // 第二段有多少个空

        return slot1 * slot2;

    }
}