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

1.1 设计算法判断一个字符串中字符都是否唯一的。如果不能使用额外的数据结构呢?

2013-05-28 15:10 721 查看
1.1 设计算法判断一个字符串中字符都是否唯一的。如果不能使用额外的数据结构呢?

解答(1):先假设字符串中的字符均为ASCII码(如果不是的可以增大存储空间,而算法的逻辑是相同的)。“假设”在你的面试中非常的重要。

bool IsUniquechars(string str)
{
bool charset[256];
memset(charset,0,sizeof(bool)*256);
for (int i=0;i<str.size();i++)
{
if (charset[str.at(i)])
{
return false;
}
charset[str.at(i)]=true;
}
return true;
}

解答(2)采用bit序列来代替数组可以为我们进一步节省空间。这里我们需要假设字符串中的字符为'a'-'z'。这样只要用一个int型的变量就能记录字符是否出现了。算法的时间空间复杂度均为O(n),n为字符串的长度。

注释:一个int型变量用4个字节表示,有32位,而'a'-'z'共26个字符,则用每一位来存储第str.at(i)-'a'个字符是否出现过,如果前面已经出现,则表示有重复

bool IsUniquechars(string str)
{
int check=0;
int val;

for (int i=0;i<str.size();i++)
{
val=str.at(i)-'a';
if ((check & (1<<val))>0) //第val个字符已经出现,check该位置为1,字符再次出现
{
return false;
}
check |=(1<<val);//第str.at(i)-'a'个字符出现,该位置为1
}
return true;
}
解答(3) 使用插入排序,如果出现相同字符,则停止,O(nlogn))
字符串本身不会变化,因为是值传递。

bool IsUniquechars(string str)
{
char val;
for (int i=1;i<str.size();i++)
{

if (str.at(i)==str.at(i-1))
{
return false;
}
if (str.at(i)<str.at(i-1))
{
val=str.at(i);
for (int j=i-1; j>=0 && val<str.at(j);j--)
{
str.at(j+1)=str.at(j);
}

if (j>0 && val==str.at(j))//是否出现相等情况
{
return false;
}
str.at(j+1)=val;
}

}
return true;
}

P.S. 

本题还有其他的解法:

1. 检查每一个字符在字符串中的出现次数,这样的方法时间复杂度为O(n^2),但是空间复杂度为0。

2. 如果字符串中的内容可以破坏的话(值传递不会破坏)。我们可以将字符串中的字符排序(时间复杂度为O(nlogn)),然后遍历字符串中的某个字符相邻的字符时候相同。但是要注意有些排序算法是需要额外的存储空间的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试 编程
相关文章推荐