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

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

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

問題1-3.

2つの文字列が与えられたとき、片方がもう片方の並び替えになっているかどうかを決定するメソッドを書いてください。

文字列から文字を1つ1つチェックしていく方法が直ぐに思い浮かんだ。

package solve;

import java.util.HashMap;

public class Solve {

	public static void main(String[] args) {
		String inputStr1 = args[0];
		String inputStr2 = args[1];
		
		int str1Len = inputStr1.length();
		int str2Len = inputStr2.length();
		
		//並び替えの場合、長さは等しいことが十分条件
		if(str1Len != str2Len){
			System.out.println("片方はもう片方の並び替えではありません");
			return;
		}
		//1つ目の文字列に含まれる文字のchar値シーケンスをキーとしたマップを作成する。
		HashMap<Character, Boolean> charMap = new HashMap<Character, Boolean>();
		for(int i=0; i<str1Len; ++i){
			char c1 = inputStr1.charAt(i);
			charMap.put(c1, true);
		}
		
		for(int i=0; i<str2Len; ++i){
			char c2 = inputStr2.charAt(i);
			//1文字でも含まれていれば並び替えではない。
			if(!charMap.containsKey(c2)){
				System.out.println("片方はもう片方の並び替えではありません");
				return;
			}
		}
		System.out.println("片方はもう片方の並び替えになっています。");
	}

}

解答として記載されていたのは、文字列をソートしてから比較する方法。

package solve;

import java.util.Arrays;
import java.util.HashMap;

public class Solve1 {

	public static void main(String[] args) {
		if(args.length == 0){
			System.out.println("引数を入力してください");
			return;
		}
		String inputStr1 = args[0];
		String inputStr2 = args[1];
		
		Solve1 solve1 = new Solve1();
		
		//並び替えの場合、長さは等しいことが十分条件
		if(solve1.compStrs(inputStr1, inputStr2)){
			System.out.println("片方はもう片方の並び替えになっています。");
			return;
		}else{
			System.out.println("片方はもう片方の並び替えではありません");
		}
	}
	
	/**
	 * 文字列をソートしてからequalsメソッドで比較
	 * @param str1
	 * @param str2
	 * @return
	 */
	public boolean compStrs(String str1, String str2){
		if(str1.length() != str2.length()){
			return false;
		}
		return strSort(str1).equals(strSort(str2));
	}
	
	/**
	 * 文字列のソート
	 * @param str
	 * @return
	 */
	public String strSort(String str ){
		char[] charArray = str.toCharArray();
		Arrays.sort(charArray);
		return new String(charArray);
	}
}