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