看過編程珠璣的一定對裏面用來解決“字符循環左移”的翻手算法印象深刻,這個算法非常容易實現,效率還賊給力!
先說一下題意:如現在有一串字符:ABCDEFG,讓前兩個字符循環左移到整個個字符串的右邊,結果即:CDEFGAB
在具體講這種算法之前,先來看看線性代數裏的轉置。(AB)T等於什麼?等於BTAT。那麼(ATBT)T等於什麼?等於(BT)T(AT)T,即BA。
啊哈!我們用三個步驟就可以完成這個字符串的循環左移了。對於字符串來講,轉置在這裏就是逆置。把原始字符串分成ab兩部分,a是前i個元素,b是後n-i個元素,首先對a求逆,得到a-1b,然後對b求逆得到a-1b-1,然後對整體求逆得到(a-1b-1)-1=ba。
下面這張圖形象地說明了這種算法,這裏是將一個長度爲10的字符串循環左移5位。
代碼實現很簡單,java代碼如下:
public class TurnHand {
public String process(String str,int m){
char[] cs=str.toCharArray();
turnHand(cs,0,m-1);
turnHand(cs,m,cs.length-1);
turnHand(cs,0,cs.length-1);
return new String(cs);
}
public void turnHand(char[] cs,int i,int j){
int length=j-i+1;
for(int t=0;t<length/2;t++,i++){
char temp=cs[i];
cs[i]=cs[j-t];
cs[j-t]=temp;
}
}
public static void main(String[] args) {
String str="ABCDEFG";
String result=new TurnHand().process(str, 6);
System.out.println(result);
}
}