判断2个字符串是否含有相同的字符

第一种:暴力法解决,时间复杂度太大,N*N。

第二种:也可以选择使用C++的map,map的插入和查找效率是lgN,所以总的时间复杂度是NlgN。当然你还可以使用unordered_map(底层是哈希存储),效率更高一点。

第三种:使用逻辑运算符&和 | 的性质。

具体实现是:每个字符都有一个ASCII码值,遍历一个字符串,把每个字符(ASCII码值为C)都转化成1 << C,然后将所有字符的转化形式都这样或(|)在一起。 最后将两个字符串的 | 结果相&,如果没有相同的字符那么结果为零,如果有相同的字符结果不为零。

该方法的缺点:

(1)如果字符串中包含所有ASCII字符,也就是最多128个,那么最大的字符就需要左移128位才能表示,这么大的整数long long类型也存不下啊。所以这种方法只能用在字符串中字符种类有限的情况,比如只含有小写字母(26位,int类型满足),只含有小写字母(52位,long long类型可以满足)。

(2)就算满足了第一个条件,还有一个缺点是该方法只能判断出是否有相同字符,如果你要找有多少相同字符啊?或者说相同的字符都是什么的时候,该方法就无能为力啦。

第四种方法:通用解法,时间复杂度为O(N)。

使用两个数组:a,b,数组长度定义为128,初始化为0;下标就代表字符的ASCII码值,遍历字符串,把出现的次数分别存入对应下标的value值。最后比较两个数组即可。

该种方法给我们的启示:如果遇到相关的字符串问题(特别是字符串中只含有大小写字母啥的),然后让你比较相同字符啊,匹配最长字符串啊什么的鬼题目,不妨首先想一下先把这些字符或者字母用数组存起来(数组存字符:字符的ASCII码值可以当做下标,出现的次数或者在字符串中出现的位置可以当做value值存入数组),然后在进行其他的处理。切记!切记!

C++代码如下:

#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <set>

using namespace std;

//可以比较所有ASCII字符,返回所有相同的字符
vector<char> judgeSameChar(string s1, string s2)
{
	int a[128] = {0}, b[128] = {0};//两个数组,分别存两个字符串中的字符,下标就对应字符的ASCII码
	for (auto i : s1)
		a[i]++;
	for (auto j : s2)
		b[j]++;
	vector<char> res;
	for (int k = 0; k < 128; k++)
	{//如果对应下标的a、b数组中的value值都不为零说明该字符在s1和s2中都存在
		if(a[k] != 0 && b[k] != 0)
			res.push_back(k);
	}
	return res;
}

int main()
{
	string s1, s2;
	cin >> s1 >> s2;

	vector<char> res;
	res = judgeSameChar(s1, s2);
	for (auto x : res)
		cout << x << "  ";
	cout << endl;

	system("pause");
	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值