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 を行けるところまで後方に動かしていく感じ。こうすると、場合分けとかも少なくシンプルに実装できる。