1. 程式人生 > 其它 >字串移位演算法總結

字串移位演算法總結

技術標籤:字串演算法leetcode

字串移位演算法總結


題目如下:
把字串前面的若干個字元轉移到字串的尾部。請定義一個函式實現字串左旋轉操作的功能。比如,輸入字串"abcdefg"和數字2,該函式將返回左旋轉兩位得到的結果"cdefgab"。
詳情請見力扣: 左旋轉字串
以下的程式碼均以在力扣AC

暴力遍歷法

這種應該是最容易想到的方法了,要將前n位字元移位就整體向前移位n次,每次整體移位的時候都將此時的首字元移到字元尾。
(n^2去世)

char* reverseLeftWords
(char* s, int n){ /*暴力遍歷法*/ int len = strlen(s); for(int i = 0;i<n;i++) { int temp = s[0]; for(int j = 1;j<len;j++) { s[j-1] = s[j]; } s[len-1] = temp; } return s; }

空間換時間法

就是再開闢一個數組用來接收後len-n位和前n位

char* reverseLeftWords(char* s, int n){
/*空間換時間法*/
char *temp;
int len =
strlen(s); temp = (char *)malloc(sizeof(char)*(len+1)); for(int i = n;i<len;i++) { temp[i-n] = s[i]; } for(int i = 0;i<n;i++) { temp[len-n+i] = s[i]; } temp[len] = '\0'; return temp; }

庫函式複製法

C語言對於字串提供了許多的字串處理函式。
下面我們主要用到strcpy(str1,str2)函式(將str2所指的字串複製到str1中 )
strncpy(str1,str2,n)函式(將str2所指的前n位複製到str1中)

char* reverseLeftWords(char* s, int n){
/*庫複製函式法*/
char *temp;
int len = strlen(s);
temp = (char *)malloc(sizeof(char)*(len+1));

strcpy(temp,s+n);

strncpy(temp+len-n,s,n);

temp[len] = '\0';
return temp;
}

取餘法

此法可以看作是暴力法的簡化版,取餘法超級絲滑

/*取餘法*/
int i = 0;

int len = strlen(s);
char *temp = malloc(sizeof(char)*(len+1));
while(i<len)
{
    *(temp++) = s[(n+i++)%len];
}

*temp = '\0';//擷取長度len
return temp-len;//因為return上面那一步後ans指向的是空字元,return ans-len是讓指標指向第一個字元/*/
}

求逆交換法

不重新開闢一個空間,直接在原數組裡面分段交換字元
但是這種方法需要另外定義一個函式,當然你for寫三遍也不是不行

void reverse(int p,int q,char *s)
{
    int i,j;
    for(i = p,j = q;i<j;i++,j--)
    {
        char temp = s[j];
        s[j] = s[i];
        s[i] = temp;
    }
}
char* reverseLeftWords(char* s, int n){
int len = strlen(s);
reverse(0,n-1,s);
reverse(n,len-1,s);
reverse(0,len-1,s);
return s;
}

以上的5種方法可以為我們提供很多思路