ホーム LeetCode. 38. Count and Say
記事
キャンセル

LeetCode. 38. Count and Say

image

問題

解法

最初の項 "1" から始めます。次の項を作るには、現在の項を左から右へ走査し、同じ数字が連続する最大の区間を見つけ、その長さ、続いて数字を追加します。区間全体を処理してから次の位置へ進むため、各数字は一度だけエンコードされます。この変換を n - 1 回繰り返すと、求める項が得られます。

各ラウンド終了時の項の長さを L_k とします。項の処理にはその長さに比例する時間がかかり、次の項を生成するため、全体の時間計算量は O(生成した項の長さの合計) です。各ラウンドでは現在の項と次の項だけを保持するため、作業領域は O(現在の項の長さ) です。次の項の長さは現在の項の長さの定数倍以内です。

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
    public String countAndSay(int n) {
        String term = "1";

        for (int round = 1; round < n; round++) {
            StringBuilder next = new StringBuilder();
            int i = 0;

            while (i < term.length()) {
                char digit = term.charAt(i);
                int end = i + 1;
                while (end < term.length() && term.charAt(end) == digit) {
                    end++;
                }

                next.append(end - i).append(digit);
                i = end;
            }

            term = next.toString();
        }

        return term;
    }
}
この記事は著者により CC BY 4.0 ライセンスで公開されています。