问题:
给你两个字符串,比如 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