26.左旋轉字符串
題目:
定義字符串的左旋轉操作:把字符串前面的若干個字符移動到字符串的尾部。
如把字符串abcdef左旋轉2位得到字符串cdefab。請實現字符串左旋轉的函數。
要求時間對長度為n的字符串操作的復雜度為O(n),輔助內存為O(1)。
[cpp] #include<iostream>
#include<iomanip>
using namespace std;
void reverse(char *s,const int strl)
// 以s為起始位置,長度為 strl
{
int i,j;
char tc;
for(i=0,j=strl-1/* 長度減一 */;i<j;i++,--j)
{
tc=s[i];
s[i]=s[j];
s[j]=tc;
}
}
void Lshift(char *s,int m)
{
const int slen=strlen(s);
reverse(s,m);
reverse(s+m,slen-m);
reverse(s,slen);
}
int main()
{
char s[]="abcdefghijklmn";
Lshift(s,4);
cout<<s<<endl;
system("pause");
return 0;
}
#include<iostream>
#include<iomanip>
using namespace std;
void reverse(char *s,const int strl)
// 以s為起始位置,長度為 strl
{
int i,j;
char tc;
for(i=0,j=strl-1/* 長度減一 */;i<j;i++,--j)
{
tc=s[i];
s[i]=s[j];
s[j]=tc;
}
}
void Lshift(char *s,int m)
{
const int slen=strlen(s);
reverse(s,m);
reverse(s+m,slen-m);
reverse(s,slen);
}
int main()
{
char s[]="abcdefghijklmn";
Lshift(s,4);
cout<<s<<endl;
system("pause");
return 0;
}
分析:在Lshift函數中,調用三次reverse,前兩次將字符串分段分別翻轉,最後再整個翻轉一次,效果就是左旋m。