判断是否为对方的排列

120 阅读1分钟

题目描述

若两个列表包含相同的项,项的顺序可能不同,则它们被称为对方的排列(若一个列表中某个项有k个,则另一个列表中该项也应该有k个)。如,列表<7e7q>和< qe77>互为排列,而<31415>和<53431>则不是。

写一个程序,读入两个列表,判断它们是否互为对方的排列。

示例

image.png

思路

  1. 判断是否是对方的排序,首先,若两个项长度不同,则肯定不互为排列。

  2. 其次,若两个长度相同,则可以直接先排序,再比较。

  3. 排序有两种方法,法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表示指向尾元素的下一个地址。