# String# Sorting# Preprocessing

e524 - 106 彰雲嘉區複賽 - Q4 變位字判斷

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷兩行文字是否為變位字。變位字是指兩段文字包含的字母相同,但字母的排列順序不同。忽略大小寫和標點符號,只考慮字母。

解題思路

程式首先讀取測試案例的數量 n。對於每個測試案例,程式讀取兩行字串 ab。然後,程式將字串 ab 中的所有字母轉換為小寫,並去除非字母字元,儲存在新的字串 aabb 中。接著,程式對 aabb 進行排序。最後,程式比較排序後的字串 aabb。如果它們相等,則輸出 1,表示 ab 是變位字;否則,輸出 0。

複雜度分析

  • 時間複雜度: O(n log n),其中 n 是字串的長度。這是因為排序操作的時間複雜度是 O(n log n)。
  • 空間複雜度: O(n),因為需要額外的空間來儲存轉換後的字串 aabb

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int n;
	string a,b;
	cin >> n;
	getline(cin,a);
	while(n--){
		getline(cin,a);
		getline(cin,b);
		int al=a.length(),bl=b.length();
		string aa,bb;
		for(int i=0;i<al;++i){
			if(a[i]>='a'&&a[i]<='z')
				aa+=a[i];
			else if(a[i]>='A'&&a[i]<='Z')
				aa+=a[i]+'a'-'A';
		}
		for(int i=0;i<bl;++i){
			if(b[i]>='a'&&b[i]<='z')
				bb+=b[i];
			else if(b[i]>='A'&&b[i]<='Z')
				bb+=b[i]+'a'-'A';
		}
		sort(aa.begin(),aa.end());
		sort(bb.begin(),bb.end());
		if(aa!=bb)cout << "0\n";
		else
			cout << "1\n";
	}
}

Discussion