利用空间换时间减少时间复杂度以及以C语言字符串处理为例减少空间复杂度

在处理字符串的过程当中,通常情况下都会逐个遍历整个字符串数组,在多个字符串的处理中,处理不同,时间复杂度不同,这里通过利用空间换时间等不同方法,以字符串处理为例来讨论几种情况:

1:空间换时间,减少时间复杂度

 写一个函数返回bool值,来判断给定的字符串A和B(假设都是小写字母),
 是否是B中的字符都存在于A中,如果是返回true,否则返回false
 例如:A="ababcdeabcdef";B="aabbccef"->返回true;
      A="abcabcdefaij";B="aaabbcxaab";->返回false;

在这里插入图片描述

由上图可以看到:
B1字符都存在于A1字符串中,而B2中的字符x不存在与A2中, 通常第一思路都会对字符串进行遍历,取B中的一个字符和A 中的字符进行对比,最坏的情况下需要每遍历一次B后,再从头到尾遍历A中的字符,判断是否相同,时间复杂度为O(n^2)。
为了减少时间复杂度,算法思想:利用空间换时间来减少时间复杂度,这里利用一个数组来保存A中出现的字母,将a,b,c,d等记录在0,1,2,3,…下标下,而’a’-‘a’=0 , ‘b’-‘a’=1 , … , ‘z’-‘a’=25,恰好对应数组的下标0~25。因此通过 *A-‘a’ 将A中字符记录到数组中,之后遍历B中的字符是否出现在chars中,不出现返回false,出现继续向后遍历,直到跳出循环。

//代码
bool CheckString(const char *A,const char *B)//A >= B 
{
	int chars[26] = {0};
	//登记A中出现的字母,a登记在0下标,b登记在1下标,c登记在2下标...z登记在25下标
	//'a'-'a'=0,'b'-'a'=1,'z'-'a'=25->*A-'a'
	
	while(*A != '\0')//遍历A,登记所有的字母
	{
		chars[*A - 'a']++;//哈希表,散列表
		A++;
	}
	
	while(*B != '\0')//遍历B,查看B中所有字符是否出
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值