技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

同じ文字でグルーピング

leetCode の以下の問題を解いた。
https://leetcode.com/problems/string-compression/

文字列中の連続する同じ文字をグルーピングするという問題。
こういうのは、これまで、文字列を前から見て行って、同じ文字の連続が途切れたら、その1つ前までを1グループとして纏める、といった感じで処理を書いていた。

しかし、解説を読んだところ、two pointers 的な考えを使って書くと、よりシンプルに書けることが分かった。以下のような感じ。

public class StringCompression {
    public int compress(char[] chars) {
        int start = 0;
        int curPos = 0;
        while (start < chars.length) {
            int end = start;
            while (end < chars.length && chars[end] == chars[start]) {
                end++;
            }
            // ここを抜けてきた時の end は、例えば、aaaaaa[b]bb の [b] を指している。
            // つまり、end の一つ前までが同じ a グループとなる。

            int groupLen = end - start;
            chars[curPos++] = chars[start];
            if (groupLen > 1) {
                for (char ch : Integer.toString(groupLen).toCharArray()) {
                    chars[curPos++] = ch;
                }
            }
            start = end;
        }
        return curPos;
    }
}

グループの start を一旦固定して、そこから end を行けるところまで後方に動かしていく感じ。こうすると、場合分けとかも少なくシンプルに実装できる。