旋转字符串

旋转字符串
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;
	}
}

不用函数的方法速度要快很多。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值