《Cracking the Coding Interview程式設計師面試金典》----確定字元互異

塵封的記憶0發表於2017-04-18
時間限制:3秒 空間限制:32768K 熱度指數:8610
本題知識點: 程式設計基礎 字串
 演算法知識視訊講解

題目描述

請實現一個演算法,確定一個字串的所有字元是否全都不同。這裡我們要求不允許使用額外的儲存結構。

給定一個string iniString,請返回一個bool值,True代表所有字元全都不同,False代表存在相同的字元。保證字串中的字元為ASCII字元。字串的長度小於等於3000。

測試樣例:
"aeiou"
返回:True
"BarackObama"

返回:False



解題思路:

ASCII中字元的個數也是有限的,有256個。因此這題可以用一個大小為256的陣列,遍歷字串時把對應的個數記錄在陣列裡,陣列某一項數字超過1那麼就表示有重複字元了。
#include<iostream>
#include<iomanip>
#include<cmath>
#include<stdio.h>
#include<string.h>
using namespace std;
bool checkDifferent(string iniString) {
	//ascii字符集只有256個字元
	if (iniString.size() > 256)
		return false;
	bool result[256] = { false };
	for (size_t i = 0; i < iniString.size(); ++i)
	{
		int tmp = iniString[i];
		if (result[tmp])
			return false;
		result[tmp] = true;
	}
	return true;
}
int main()
{
	double s;
	int i;
	string n, m;
	while (cin >> n)
	{
		if (checkDifferent(n) == 1)
			cout << "Ture" << endl;
		if (checkDifferent(n) == 0)
			cout << "False" << endl;
	}
	return 0;
}

如果範圍縮寫到a-z,
26個字元,那麼也可以用位操作來解決這個問題。對於26個字元,每個字元在它對應的ASCII碼值對應的位置上設定一個標誌,例如設定標誌位為1,當字元不重複時1的位置都是錯開的,所以位與的的結果必定為零,不為零說明之前出現過一個這樣的字元。26個字元需要的資料型別至少有26位,而int型有32位,夠用了。
#include<iostream>
#include<iomanip>
#include<cmath>
#include<stdio.h>
#include<string.h>
using namespace std;
bool checkDifferent(string iniString) {
	if (iniString.size() > 256)
		return false;
	int result = 0;
	for (size_t i = 0; i < iniString.size(); ++i)
	{
		int c = iniString[i] - 'a';
		int check = 1 << c;
		if ((result & check) != 0)    //注意'&'的優先順序比‘<','!='低,括號不能丟
			return false;
		result |= check;
	}
	return true;
}
int main()
{
	double s;
	int i;
	string n, m;
	while (cin >> n)
	{
		if (checkDifferent(n) == 1)
			cout << "Ture" << endl;
		if (checkDifferent(n) == 0)
			cout << "False" << endl;
	}
	return 0;
}

不懂的可以加我的QQ群:261035036(IT程式設計師面試寶典

群) 歡迎你到來哦,看了博文給點腳印唄,謝謝啦~~


相關文章