1. 程式人生 > >字符串的旋轉

字符串的旋轉

旋轉 swa -s bst ota 如果 簡化 vector subst

題目描述

對於一個字符串,和字符串中的某一位置,請設計一個算法,將包括i位置在內的左側部分移動到右邊,將右側部分移動到左邊。

給定字符串A和它的長度n以及特定位置p,請返回旋轉後的結果。

測試樣例:
"ABCDEFGH",8,4
返回:"FGHABCDE"


問題簡化:假設現在只要把E放在左邊,那麽我們可以先用一個變量記錄E,然後把整個字符串向右移動一位,第一個空出來的位置用變量填充,即達到效果。
那麽現在的問題,就是把p到n-1的字符放在串首,還是和上面一樣道理,只是加一個外循環,看需要向右移動幾次。代碼如下:
class StringRotation {
public:
    string
rotateString(string A, int n, int p) { // write code here char ch; for(int i=0;i<n-p-1;i++) { ch=A[n-1]; for(int j=n-1;j>=1;j--) { A[j]=A[j-1]; } A[0]=ch; } return A; } };

思路:題目的意思是把後部分的字符串都轉移到原字符串的串首。那麽首先需要計算有多少個字符需要轉移。用一個外循環,n-1-p即為後部分的字符數(所需要轉移字符);另外設一個字符ch用來記錄最後一個字符,然後開始用一個內循環,每次刪除最後一個字母,直到刪除到0處,把ch記錄的字符放在下標為0處;

通過查閱資料,發現一些簡單方法.

第一次兩部分分別reverse 。 第二次整體reverse。
string rotateString(string A, int n, int p) {
    // write code here
    //劍指offer上的題目,兩次翻轉
     
    //先進行局部翻轉
    int i = 0, j = p;
    while(i < j)
        swap(A[i++], A[j--]);
     
    i = p + 1, j = n - 1; 
    while(i < j)
        swap(A[i
++], A[j--]); //再整體翻轉 i= 0, j = n - 1; while(i < j) swap(A[i++], A[j--]); return A; } // 如果調用reverse函數,看起來更簡單。。。 string rotateString(string A, int n, int p) { // write code here //劍指offer上的題目,兩次翻轉 //先進行局部翻轉 reverse(A.begin(), A.begin()+p+1); //vector的叠代器支持 + reverse(A.begin()+p+1, A.end()); //再整體翻轉 reverse(A.begin(), A.end()); return A; }

拼接兩個字符串,從中間截取源字符串長度,就得到了旋轉字符串
classStringRotation {
 
public:
 
    string rotateString(string A, intn, intp) {
 
        // write code here
 
        return(A+A).substr(p+1,n);
 
    }
 
};

字符串的旋轉