算法學習筆記(4)----字符串字符惟一

題目描述:有一個字符串,判斷這個字符串的各個字符是不是惟一的數組

解法1:假設這個字符串的編碼爲ascii,因此設置一個長度爲256的bool數組,數組下標設爲字符的ascii碼,數組的值初始化爲0。對字符串的字符循環判斷,若是ascii碼對應的value爲1,則不惟一,value爲0繼續循環直到終止,代碼以下:編碼

bool unique(string s)
{
	if (s.length() > 256)
		return false;
	bool flag[256];
	memset(flag, 0, 256*sizeof(bool));
	for (int i=0; i<s.length(); i++)
	{
		int val = int(s[i]);
		if (flag[val])
			return false;
		flag[val] = true;
	}
	return true;
}

該方法的空間複雜度與輸入字符串的長度無關,因此爲O(1),時間複雜度爲O(n)。spa

以上的方法空間存儲要256個字節,其實咱們能夠觀察到,它用一個字節來表示true或是false,浪費了其它7個bit,因此咱們能夠改進成用一個bit來表示true或是false,用到的空間存儲爲32個字節。想法是用每一位表明一個字符,代碼以下:code

bool unique_2(string s)
{
	if (s.length() > 256)
		return false;
	int flag[8];
	memset(flag, 0, sizeof(int)*8);
	for (int i=0; i<s.length(); i++)
	{
		int val = int(s[i]);
		int index = val / 32;  //找到下標
		int bit = val % 32;		//找到bit
		if (flag[index] & (1 << bit))
			return false;
		flag[index] |= (1 << bit);
	}
	return true;
}
相關文章
相關標籤/搜索