题目:
给定两个字符串,请编写程序,确定其中一个字符串重新排序后能否得到另一个字符串。
输入有两行对应为两个字符串(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;
}