1つの文字列を隣接文字から別の文字列にシフトする[No.54]

1809 ワード

質問:
ABCDやDBCAのような2つの文字列を与え、隣接する文字の位置を交換することで、最初の文字列を2番目の文字列に変え、すべてのステップを印刷します.例えばABCDからDBCAまで、ステップは:
ABCD --->BACD--->BCAD--->BCDA--->BDCA--->DBCA
分析:
2つの文字列に含まれる文字が同じで、位置が異なるだけであれば、隣接する文字を交換することで、1つの文字列から別の文字列に変えることができることを証明することができますが、ここでは証明を無視して、この事実を知るだけでいいです.
1つの文字から別の文字に移動するには、最も便利で最も効果的な方法は、ターゲット文字列の最後のビットから(例えば、さっきの例では、ターゲット文字列の最後の文字はA)変更文字の元の文字列の位置を見つけ、2つのシフトによって元の文字列からターゲット文字列の位置に移動することです.私たちはターゲット文字列を順次2番目の文字に移動します.△順数の最初の文字ではないのはなぜですか.自分で考えます.
文字列に重複文字がある場合に便利なメリットがあります.信じないなら、さっき出した方法よりいいかどうか、他の方法で試してみてください.
public class Transpose {
	
	public void transpose(String strFrom, String strTo) {		
		char[] charFrom = strFrom.toCharArray();
		char[] charTo = strTo.toCharArray();
		
		int length = strFrom.length();
		int index = length - 1;
		int position = - 1;
		
		//print the original string
		swap(0,0, charFrom);
		//start from the end
		while (index > 0) {
			position = findPosition(charTo[index], charFrom, index);
			//swap the characters
			for (int j = position; j < index ; j++) {
				swap(j, j + 1, charFrom);
			}
			index--;
		}
	}
	
	// swap and print
	public void swap (int p1, int p2, char[] strTrans) {
		char temp = strTrans[p1];
		strTrans[p1] = strTrans[p2];
		strTrans[p2] = temp;
		
		for (char ch : strTrans) {
			System.out.print(ch);
		}
		System.out.println();
	}
	// find the position of charater "ch" in the ori
	public int findPosition(char ch, char[] charFrom, int index) {
		int position = -1;
		for (int i = index; i >= 0; i--) {
			if (charFrom[i] == ch) {
				position = i;
				break;
			}
		}
		return position;
	}
	
	public static void main(String[] args) {
		new Transpose().transpose("ABCD", "DBCA"); 
	}
}

転載して出典を明記する:http://blog.csdn.net/beiyeqingteng