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)),然后遍历字符串中的某个字符相邻的字符时候相同。但是要注意有些排序算法是需要额外的存储空间的。
解答(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)),然后遍历字符串中的某个字符相邻的字符时候相同。但是要注意有些排序算法是需要额外的存储空间的。
相关文章推荐
- 实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- 经典算法面试题目-判断一个字符串中的字符是否唯一(1.1)
- 经典算法面试题目-判断一个字符串中的字符是否唯一(1.1)
- 设单链表中存放n个字符,试设计一个算法,使用栈判断该字符串是否中心对称
- 算法练习:判断一个字符串中的字符是否唯一(只用基本数据结构)
- 【面试经典题之字符串】实现一个算法,确定一个字符串的所有字符是否全都不同。假设不允许使用额外的数据结构
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中
- CI1.1 实现一个算法,确定一个字符串的所有字符是否全部不同。假使不允许使用额外的数据结构。
- 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构
- 判断一个字符串中的字符是否唯一(只用基本数据结构)
- 1.1判断一个字符串中的字符是否唯一
- 判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进
- 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
- CTCI系列--1.1 判断一个字符串中的字符是否唯一(C语言)
- 判断一个字符串中的字符是否唯一(只用基本数据结构)
- 判断一个字符串的所有字符是否都是唯一的(使用hash表方法)
- 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代
- CTCI系列--1.1 判断一个字符串中的字符是否唯一(C语言)
- 设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称