把一个字符串通过相邻字符移位变成另一个字符串 [No. 54]

问题:

给你两个字符串,比如 ABCD 和 DBCA,通过交换相邻字符的位置,把第一个字符串,变成第二个字符串,打印所有的步骤。比如从ABCD到DBCA,步骤是:

ABCD --->BACD--->BCAD--->BCDA--->BDCA--->DBCA

分析:

如果两个字符串里所含的字符是一样的,只是位置不一样,我们是可以证明通过交换相邻的字符,能够从一个字符串变成另一个字符串,但是,这里忽略证明,大家只需要知道这个事实就可以了。

要从一个字符到另一个字符,最方便也是最有效的方法是从目标字符串的最后一位开始(比如刚刚的例子里,目标字符串最后一个字符是A),找出改字符在原始字符串的位置,然后通过两两移位使得该字符从原始字符串移动到目标字符串的位置。我们不断遍历目标字符串,直到顺数第二个字符(为何不是顺数第一个字符?自己思考。)。

这样做有一个好处,可以非常方便处理字符串里有重复字符的情况。如果不相信,可以用其它方法试试,看是否比刚刚给出的方法更好。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值