データ構造 〜 第1章 配列と文字列 問題1-5

世界で闘うプログラミング力を鍛える150問 ~トップIT企業のプログラマになるための本~

世界で闘うプログラミング力を鍛える150問 ~トップIT企業のプログラマになるための本~

問題1-5.

文字の連続する数を使って基本的な文字列圧縮を行う。例えば、「aabee」→「a2b1e2」と変換する。ただし、圧縮しても文字列が元の文字列よりも短くならなかった場合は元の文字列を返却する。

1文字でも「b1」とするのが嫌だったので、そこは勝手にルールを変更して1文字の場合は数字を出力しないようにして、次のように書いた。

package solve;
public class Solve {
	public static void main(String[] args) {
		if(args.length == 0){
			System.out.println("パラメータを入力してください。");
			return;
		}
		
		Solve solve = new Solve();
		System.out.println(solve.compress(args[0]));
		
	}
	
	public String compress(String str){
		if(str.length() == 1){
			return str;
		}
		
		StringBuffer stringBuffer = new StringBuffer();
		char[] strArray = str.toCharArray();
		char   tmp	    = strArray[0];
		int    count 	= 1;

		for(int i=1; i<strArray.length; ++i){
			if(tmp == strArray[i]){
				++count;
				if(i == strArray.length-1){
					stringBuffer.append(tmp);
					stringBuffer.append(count);
				}
			}else{
				stringBuffer.append(tmp);
				if(count != 1){
					stringBuffer.append(count);
				}
				tmp   = strArray[i];
				count = 1;
			}
		}
		
	   return (str.length() == stringBuffer.toString().length() ? str : stringBuffer.toString());
	}

}

文字列"aa"を入力すると、"aa"が返却されて、バグかと思ったけど、この場合圧縮した文字列は"a2"となるが"aa"と文字列の長さが変わらないので元の文字列を返している(仕様)。