变形词问题

题目:

给定两个字符串,请编写程序,确定其中一个字符串重新排序后能否得到另一个字符串。

输入有两行对应为两个字符串(ASCII码范围内)。

其中一个字符串重新排序后可以得到另一个字符串就输出true,否则输出false。

思路:

将两个字符串排序,若排序后的两个字符串完全相同,就输出true,不同则输出false。该算法的时间复杂度为nlgn,代码如下:

#include <bits/stdc++.h>
using namespace std;
char str1[1005];
char str2[1005];
int main() {
	gets(str1);
	gets(str2);
	int n1 = strlen(str1);
	int n2 = strlen(str2);
	if(n1!=n2) {//若两个字符串长度都不同,就不可能变形后相同了 
		printf("false");
		return 0;
	}
	sort(str1,str1+n1);
	sort(str2,str2+n2);
	if(!strcmp(str1,str2)) printf("true");
	else printf("false");
	return 0;
}

这道题还可以有更优的做法,可以用计数排序的思想,定义一个辅助数组help,先将str1中的字符对应到help中,在遍历str2数组,将help数组中的值对应消去。空间换时间,这种算法的时间复杂度为O(n),细节见代码:

#include <bits/stdc++.h>
using namespace std;
char str1[1005];
char str2[1005];
char help[1005];
int main() {
	gets(str1);
	gets(str2);
	int n1 = strlen(str1);
	int n2 = strlen(str2);
	if(n1!=n2) {//若两个字符串长度都不同,就不可能变形后相同了 
		printf("false");
		return 0;
	}
	for(int i=0;i<n1;i++)
		help[str1[i]]++;
	for(int i=0;i<n2;i++) {
		help[str2[i]]--;//一边遍历str2数组,一边做判断,辅助数组只要有一个数突破0的下限,就可以直接判定为false 
		if(help[str1[i]]<0) {
			printf("false");
			return 0;
		}
	}
	for(int i=0;i<260;i++)//最后检查下help数组中的值是否都为0 
		if(help[i]!=0) {
			printf("false");
			return 0;
		}
	printf("true");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值