算法学习之字符串包含
2016-02-21 17:31
225 查看
问题描述:如果字符串B中的字母都能在A中出现,则字符串A包含字符串B,
本题可用位运算,用两个long long类型的数字参与位运算,两个long long类型正好128位,可以把字符串全部表示完,时间复杂度O(N),空间复杂度O(1);
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
int is_contain(const char *str1,const char *str2)
{
long long tmp1 = 0,tmp2 = 0;//前64位放进tmp1,后64位放进tmp2;
int i = 0,n;
while(str1[i])
{
n = str1[i++] - '\0';
if(n < 63)
tmp1 |= 1<<n;
else
tmp2 |= 1<<(n%64);
}
i = 0;
while(str2[i])
{
n = str2[i++] - '\0';
if(n < 63)
{
if(!((1<<n)&tmp1))
return 0;
}
else
{
if(!((1<<(n%64)&tmp2)))
return 0;
}
}
return 1;
}
int main()
{
char str1[MAX],str2[MAX];
scanf("%s %s",str1,str2);
if(is_contain(str1,str2))
printf("str1 contain str2\n");
else
printf("str1 does't contain str2");
return 0;
}
本题可用位运算,用两个long long类型的数字参与位运算,两个long long类型正好128位,可以把字符串全部表示完,时间复杂度O(N),空间复杂度O(1);
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
int is_contain(const char *str1,const char *str2)
{
long long tmp1 = 0,tmp2 = 0;//前64位放进tmp1,后64位放进tmp2;
int i = 0,n;
while(str1[i])
{
n = str1[i++] - '\0';
if(n < 63)
tmp1 |= 1<<n;
else
tmp2 |= 1<<(n%64);
}
i = 0;
while(str2[i])
{
n = str2[i++] - '\0';
if(n < 63)
{
if(!((1<<n)&tmp1))
return 0;
}
else
{
if(!((1<<(n%64)&tmp2)))
return 0;
}
}
return 1;
}
int main()
{
char str1[MAX],str2[MAX];
scanf("%s %s",str1,str2);
if(is_contain(str1,str2))
printf("str1 contain str2\n");
else
printf("str1 does't contain str2");
return 0;
}
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析