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

本文介绍几种用于判断字符串中字符是否全部唯一的算法实现方法,包括使用数组标记、位操作节省空间及利用插入排序进行比较等不同策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值