練習題(三)

給定兩個長度相同的字串,判斷是否能把其中一個字串的各個字母重組,使兩字串相同。

EX: 字串一為JWPZDJSTAC,字串二為WJDZASJPCT,此二字串相同;字串一為CADA,字串二為CCAD,此二字串不同。

本文以C++實作執行。

作法一:將字串一和字串二經過排序之後,再比較兩個字串,如果兩字串相等,則可以把其中一個字串的各個字母重組成對方。

作法二:記錄每個字串當中字元出現的次數,如果每個字串的字元出現的次數相等,則可以把其中一個字串的各個字母重組成對方。

作法三:一一比對字串一當中的每個字元是不是和字串二當中的字元相等如果相等,則把字串一和字串二相等的字元設成NULL,當最後字串一和字串二皆為NULL的時候,則可以把其中一個字串的各個字母重組。

作法四,作法五...;我們挑選作法一來實作,實作程式碼如下:

#include <iostream>
using namespace std;

char selectionSort(char*, int);
void swap(int *, int*);
int strlen_implemention(const char *);
int strcmp_implementation(const char* s1, const char * s2);

int main() {

	char s1[] = "JWPZDJSTAC";
	char s2[] = "WJDZASJPCT";
	char s3[] = "CADA";
	char s4[] = "CCAD";


	cout << "s1 = " << s1 << endl;
	cout << "s2 = " << s2 << endl;
	cout << "s3 = " << s3 << endl;
	cout << "s4 = " << s4 << endl;

	selectionSort(s1, strlen_implemention(s1));
	selectionSort(s2, strlen_implemention(s2));
	selectionSort(s3, strlen_implemention(s3));
	selectionSort(s4, strlen_implemention(s4));

	cout << "\n排序後 \n" << endl;

	cout << "s1 = " << s1 << endl;
	cout << "s2 = " << s2 << endl;
	cout << "s3 = " << s3 << endl;
	cout << "s4 = " << s4 << endl;

	cout << endl;

	if (strcmp_implementation(s1,s1)==0)
	{
		cout << "s1和s2中,可以把其中一個字串的各個字母重組成對方" << endl;
	}

	else
	{
		cout << "s1和s2中,不可以把其中一個字串的各個字母重組成對方"<<endl;
	}

	if (strcmp_implementation(s3, s4) == 0)
	{
		cout << "s3和s4中,可以把其中一個字串的各個字母重組成對方" << endl;
	}

	else
	{
		cout << "s3和s4中,不可以把其中一個字串的各個字母重組成對方" << endl;
	}



	system("pause");
	return 0;
}

char selectionSort(char* array,  int arraysize)
{
	int smallest = 0;//宣告未排序序列中最小值

	for (int i = 0; i <arraysize; i++)
	{
		smallest = i;

		for (int j = i + 1; j < arraysize; j++)
		{
			if (array[j] < array[smallest])
			{
				smallest = j;//尋找未排序序列中最小值
			}
		}

		swap(array[i], array[smallest]);//將未排序序列中的最小值加入到已排序序列中的最後端
	}
	return *array;
}
void swap(int * array_1, int* array_2)
{
	int temp = 0;

	temp = *array_1;
	*array_1 = *array_2;
	*array_2 = temp;
}

int strlen_implemention(const char *s)
{
	int count = 0;
	for (; *s != '\0'; count++, s++)
	{

	}

	return count;
}

int strcmp_implementation(const char* s1, const char* s2)
{
	if (*s1 == '\0' && *s2 != 0)//考慮其中一個字串為null的狀況
	{
		return (*s1 - *s2);
	}

	if (*s2 == '\0' && *s1 != 0)//考慮其中一個字串為null的狀況
	{
		return (*s1 - *s2);
	}

	for (; *s1 != '\0' && *s2 != '\0'; s1++, s2++)//兩兩字串中的字元比較
	{
		if ((*s1 - *s2) > 0)
		{
			return (*s1 - *s2);
		}

		else if ((*s1 - *s2) <0)
		{
			return (*s1 - *s2);
		}
	}

	return 0;
}

執行結果如下:

有夢最美 築夢踏實

活在當下 認真過每一天

我是阿夢 也是Ace