您的位置:首页 > 理论基础 > 数据结构算法

Cracking the coding interview--Q1.1

2013-07-30 21:20 260 查看
作者:ustcweijie

参考:http://hawstein.com/posts/1.1.html

1. 题目

原文:Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?

理解:设计一个算法判断字符串中字符是否有重复。要求不能使用附加数据结构(理解为只用基本的数据类型)

2. 思路

由于字符串组成的基本单位是字符,为了不失一般性,此处考虑的作用域为整个ASCII 字符集,建立一个计算器数组
c[i], 长度为256, c[i]表示ASCII码等于i的字符出现的次数。扫描待判断的字符串并统计字符出现的次数,当某个字符计数 > 1 即表示有重复字符出现。


3. 代码

C/C++代码实现:
bool IsUnique(string s)
{
int c[256];
for(int i = 0; i < 256; i++)
c[i] = 0;
for(int j = 0; j < s.length(); j++)
{
c[s[j]] += 1;
if(c[s[j]] > 1)
return false;
}
return true;
}

4. 分析

4.1. 时间复杂度:

根据代码发现该算法的时间复杂度为O(n). 空间复杂度为计数器数组的长度256字节. 为了节省空间作者hawstein 利用长度为8的int
数组(32字节=256bits)的256位实现相同的目的,请参考:http://hawstein.com/posts/1.1.html

4.2. 关于ASCII码

ASCII 码字符集用一个字节长度的整数表示 256个不同的字符,根据编译器的不同,char 分为signed char 和unsigned  char两种情况,在上述代码中,s[j] 表示字符串中位于j位置上的字符对应的ASCII 编码。 当编译器把char 解释成在signed char 时候,ASCII码-> int 转换时要特别小心,对于0~127之间的字符,可以直接赋值 int v = s[j],但是对于128 ~255 之间的字符直接复制给int
变量会是负数,因此要做一下特殊处理: int v = s[j] +256;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 数据结构