本系列为《编程之法:面试和算法心得》的读书笔记。
作为一名大龄青年,为了即将踏入研究生之路,特此需要做一些计算机相关基础知识的积累,以弥补算法知识,谨以此开始自己的算法学习之路。
算法1.1:旋转字符串
-
题目描述
给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符’a’和’b’移动到字符串的尾部,使得原字符串变成字符串“cdefab”。请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。
-
分析与解法
解法一:暴力移位法
// 算法1.1:旋转字符串,暴力移位法
void LeftShiftOne(char* strs, int number)
{
int i = 0;
char ch = strs[i];
for(i = 1; i < number; i++)
{
strs[i-1] = strs[i];
}
strs[i-1] = ch;
}
void LeftRoatateString(char* strs, int n, int m)
{
while(m--)
{
LeftShiftOne(strs, n);
}
}
// 测试函数
int main(int argc, char* argv[])
{
char strs[] = "ABCDEFGH";
LeftRoatateString(strs, 8, 3);
cout << strs << endl;
return 0;
}
算法分析:针对长度为n的字符串而言,假设需要移动m个字符到字符串的尾部,总共需要移动
m*n
次操作,同时设立一个变量存储第一个字符,故时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度为 O ( 1 ) O(1) O(1),不合题意。
解法二:三步反转法
思路分析:将一个字符串分成X和Y两部分,在每个部分字符串上定义反转操作,如 X T X^T XT,即把X的所有字符反转(例如X=“abc”,则 X T X^T X