バイトアルゴリズムの問題:B * A * C * D *パターンの文字列内のAの出現回数をカウントします

トピック

B*A*C*D* パターン付きの文字列を指定し ます。これ* は、前の文字を文字列0次 またはで 表示できること意味します 多次文字「A」の出現回数を数えます。

説明

入力:s = "BBAACCDDD"
出力:2

入力:s = "BBCDD"
出力:0

文字シーケンスは次のとおりです。BACD

回答

private static int bsStart(String s) {

        int start = 0;
        int end = s.length() - 1;
        int mid = start + (end - start) / 2;
        char tmp = 'A';
        while (start + 1 < end) {
            tmp = s.charAt(mid);
            if (tmp == 'B') {
                start = mid + 1;
            } else if (tmp == 'A' || tmp > 'B') {
                end = mid;
            }
            mid = start + (end - start) / 2;
        }
        if (s.charAt(start) == 'A') {
            return start;
        }
        return end;
    }

    private static int bsEnd(String s) {

        int start = 0;
        int end = s.length() - 1;
        int mid = start + (end - start) / 2;
        char tmp = 'A';
        while (start + 1 < end) {
            tmp = s.charAt(mid);
            if (tmp <= 'B') {
                start = mid;
            } else if (tmp > 'B') {
                end = mid - 1;
            }
            mid = start + (end - start) / 2;
        }
        if (s.charAt(end) == 'A') {
            return end;
        }
        return start;
    }

    public static int countA(String s) {

        // Write your code here
        int length = s.length();
        if (length == 0) {
            return 0;
        }
        int start = 0, end = length - 1;
        if (s.charAt(0) != 'A') {
            start = bsStart(s);
        }
        if (s.charAt(start) != 'A') {
            return 0;
        }
        if (s.charAt(end) != 'A') {
            end = bsEnd(s);
        }
        return end - start + 1;
    }


    public static void main(String[] args) {

        System.out.println(Test.countA("BBBBBAAAAAAAACDDDDD"));
    }

解析

二分法を使用して、文字Aの開始位置と終了位置を見つけ、Aの出現回数を数えます。

 

 

おすすめ

転載: blog.csdn.net/qq_25805331/article/details/109345561