您的位置:首页 > 其它

旋转字符串

2015-08-05 16:32 453 查看


旋转字符串
查看运行结果

22%

通过

给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)

样例

对于字符串
"abcdefg"
.
offset=0 => "abcdefg"
offset=1 => "gabcdef"
offset=2 => "fgabcde"
offset=3 => "efgabcd"


挑战

在数组上原地旋转,使用O(1)的额外空间

---------------------------------------------------------------------------------------------------------------------------------------------------------------
1.通过分析,就是把后offset个字符连接到字符串头部
实现:
string rotateString(string A, int offset) {
// wirte your code here
if ( A == "")
return A;
if (offset > A.size())
offset = offset%A.size();
A = (A + A.substr(0, A.size() - offset)).substr(A.size()-offset);
return A;
}


-------------------------------------------------------------------------------------------------------------------
2.设一个字符串被offset分为了两部分XY。所以要做的是(XY)T T是上标,转置 =YX
YX=((X)T(Y)T)T
所以先对字串X和Y进行转置,然后在对整串进行转置。就是想要的结果。
字符串转置:定义begin 和 end 分别指向头尾.while(begin<end) swap(begin,end);
算法实现:
string rotateString(string A, int offset) {

if (A == "")
return A;
if (offset > A.size())
offset = offset%A.size();

char tmp;
int begin = 0, end = A.size() - offset - 1;
while (begin < end)
{
tmp = A[begin];
A[begin++] = A[end];
A[end--] = tmp;
}
begin = A.size() - offset, end = A.size() - 1;
while (begin < end)
{
tmp = A[begin];
A[begin++] = A[end];
A[end--] = tmp;
}
begin = 0, end = A.size() - 1;
while (begin < end)
{
tmp = A[begin];
A[begin++] = A[end];
A[end--] = tmp;
}
/*rota(A, 0, A.size() - offset-1);
rota(A, A.size() - offset, A.size() - 1);
rota(A, 0, A.size() - 1);*/
return A;
}
注释的部分是试用函数来实现转置:
void rota(string &str, int begin, int end)
{
char tmp;
while (begin < end)
{
tmp = str[begin];
str[begin++] = str[end];
str[end--] = tmp;
}
}


不用函数的方法速度要快很多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: