算法习题26:定义字符串的左旋转操作,把字符串前面的若干个字符移动到字符串的尾部

题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。

如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。

----------------------------------------------------------------------

方法1:类似单词翻转  负负得正

这里字符串翻转仍然是像之前说的:

先翻转

例如:abcdefg------->gfedcba

假设左旋转3,我们要得到的是defgabc看出来了把,类似单词翻转,之前是用空格转回来,这里就用下标就可以了,

gfed-->defg   cba-->abc

组合起来就是defgabc

所以这个题目和单词翻转是一样样的,

 方法2:推火车 步步为淫!

模拟下面过程:

abcdefg 假设仍然是3左旋转

第一次调换(str[i]<-->str[i+offset])

def abc g

第二次

def gbc a

发现b会和空交换了,所以这时候我们把offset设置成2

def gac b

同理c又和空交换了 把offset设置程1

def gab c

得到结果,

这里offset在这个特例中刚好如此,其他特列呢?我们发现到最后都能剩1,所以有这样一个递推过程

先走strlen/offset  个offset 剩下不到offset的元素,重新设定offset 然后继续,直至最后一个


//============================================================================
// Name        : RotateStr.cpp
// Author      : YLF
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include 
#include 
#include 
using namespace std;

#define MAX 100

void RotateStr(char* &str, int offset);
void RotateStr2(char* &str, int offset);
void Reverse(char* &str, int start, int end);

int main() {
	char *str = new char[MAX];

	int offset;
	gets(str);
	cin>>offset;
	RotateStr(str, offset);
	//RotateStr2(str, offset);
	cout<=1){
		while(i0){
		i = len-1;
		temp = str[i];
		str[i] = str[i-1];
		str[i-1] = temp;
	}

}

void RotateStr2(char* &str, int offset){
	int len = strlen(str);
	Reverse(str, 0, len-1);
	Reverse(str, 0, len-offset-1);
	Reverse(str, len-offset, len-1);
}

void Reverse(char* &str, int start, int end){
	while(start < end){
		char temp = str[start];
		str[start] = str[end];
		str[end] = temp;
		start++;
		end--;
	}
}

给几个结果

abcdefg
5
fgabcde

abcdefghijklmn
11
lmnabcdefghijk

abcdef
2
cdefab

abcdefghijklmnopqrstuvwxyz
13
nopqrstuvwxyzabcdefghijklm





你可能感兴趣的:(算法)