【经典算法】字符串旋转和包含算法

这篇博客探讨了两种经典算法问题:旋转字符串和判断字符串包含。介绍了多种解法,包括暴力移位和三步反转法解决旋转字符串问题,以及常规方法、排序和素数转换法解决字符串包含问题。每种解法都分析了其时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

本系列为《编程之法:面试和算法心得》的读书笔记。

作为一名大龄青年,为了即将踏入研究生之路,特此需要做一些计算机相关基础知识的积累,以弥补算法知识,谨以此开始自己的算法学习之路。

算法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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值