题目描述
若两个列表包含相同的项,项的顺序可能不同,则它们被称为对方的排列(若一个列表中某个项有k个,则另一个列表中该项也应该有k个)。如,列表<7e7q>和< qe77>互为排列,而<31415>和<53431>则不是。
写一个程序,读入两个列表,判断它们是否互为对方的排列。
示例
思路
-
判断是否是对方的排序,首先,若两个项长度不同,则肯定不互为排列。
-
其次,若两个长度相同,则可以直接先排序,再比较。
-
排序有两种方法,法1用sort+cmp进行排序。法2用冒泡排序,然后直接比较。
具体实现
法1
#include<bits/stdc++.h>
using namespace std;
bool cmp(char a,char b){
return a<b;
}
int main(){
string s1,s2;
int flag=0;
cin>>s1>>s2;
int ls1 = s1.size();
int ls2 = s2.size();
if(ls1 != ls2){
cout<<"no";
}else{
sort(s1.begin(),s1.end(),cmp);
sort(s2.begin(),s2.end(),cmp);
for(int i=0; i<ls1; i++){
if(s1[i]!=s2[i]){
cout<<"no"; //不是对方的排列
flag=1;
break;
}
}
if(flag==0){
cout<<"yes"; //是对方的排列
}
}
return 0;
}
法2
#include<bits/stdc++.h>
using namespace std;
int main(){
string s1,s2;
int flag=0;
cin>>s1>>s2;
int ls1 = s1.size();
int ls2 = s2.size();
if(ls1 != ls2){
cout<<"no";
}else{
for(int i=0; i<ls1-1; i++){ //对s1排序,冒泡排序
for(int j=0; j<ls1-1-i; j++){
if(s1[j]>s1[j+1]){
char t = s1[j];
s1[j] = s1[j+1];
s1[j+1] = t;
}
}
}
for(int i=0; i<ls2-1; i++){ //对s2排序,冒泡排序
for(int j=0; j<ls2-1-i; j++){
if(s2[j]>s2[j+1]){
char t = s2[j];
s2[j] = s2[j+1];
s2[j+1] = t;
}
}
}
for(int i=0; i<ls1; i++){
if(s1[i]!=s2[i]){
cout<<"no"; //不是对方的排列
flag=1;
break;
}
}
if(flag==0){
cout<<"yes"; //是对方的排列
}
}
return 0;
}
小结
-
sort函数的参数有三个,第一个是排序的起始地址,第二个是排序的结束地址的下一位,第三个是排序方法(可以不用写,默认从小到大)。
-
string类型有一个begin函数和end函数,s1.begin()可以表示s1的首地址,end表示指向尾元素的下一个地址。