确定字符串是不是具有所有唯一字符

Posted

技术标签:

【中文标题】确定字符串是不是具有所有唯一字符【英文标题】:Determing if string has all unique characters确定字符串是否具有所有唯一字符 【发布时间】:2013-04-13 20:02:26 【问题描述】:

如何在不使用数组的情况下做到这一点? 我有这个实现,但我需要在不使用数组、位操作和任何其他 C/C++ 库的情况下完成它。

bool IsCharDuplication(string s) 
  bool result = false;
  bool controlArray[256];
  for (int i = 0; i < s.length(); i++) 
    int val = s[i];
    if (controlArray[val] == true) 
      result = true;
      break;
    
    controlArray[val] = true;
  
  return result;

【问题讨论】:

不,那是 10 年前我正在做作业:) 只是一个棘手的 c++ 问题,正在寻找替代方法。 谢谢,只是对有趣的限制感到好奇。 如果您检查字符映射值的数量,您也可以经常加快速度。 s.length() &gt; 128 用于 ascii 甚至 Unicode(检查可能不切实际),如果你知道什么版本的话。 【参考方案1】:

使用两个嵌套循环:

bool IsCharDuplication(string s)
   
 for (int i = 0; i < s.length(); i++) 
    for (int j = i+1; j < s.length(); j++) 
      if (s[i] == s[j])
        return true;   
 return false;

注意:您的算法时间为 O(N),但我的解决方案时间为 O(N^2)。

【讨论】:

【参考方案2】:

您可以比其他答案中建议的 O(N^2) 算法做得更好。

例如,您可以在 O(NlogN) 中对字符串进行快速排序或合并排序,然后对已排序的字符串进行一次遍历以确定 O(N) 中是否有任何重复项。总时间复杂度为 O(NlogN)。

bool IsCharDuplication (string s)

  string s2 = sort(s);
  for (int i = 0; i < s.length () - 1; i++)
    if (s2[i] == s2[i+1])
      return true;
  return false;

我没有包含排序字符串的代码,但是您可以轻松找到此类代码并编写自己的sort方法(因为您不允许使用C/C++库)。

【讨论】:

【参考方案3】:

您必须使用哈希表(或哈希集)来获得 O(n) 复杂度。以下实现使用按位运算,其中每个位对应于字母表中的每个字符。

/**
* Works for 0-127 ASCII string. Assuming, int is 16 bit.
**/
int isduplicate(const char* str)
    int hash[8]=0,0,0,0,0,0,0,0;
    while(*str) 
        int pos=*str;
        if(hash[pos/16]&(1<<(pos%16)))
            return 1;
        hash[pos/16]|=(1<<(pos%16)); 
        str++;
    
    return 0;

【讨论】:

如果 int 是 64 位,则使用此方法,您只需要其中的 2 个(对于 0-127)。如果您知道您的字符串只有 a-z 和 A-Z,您将需要 2 个 32 位 int 或 1 个 64 位 int :) OP 要求这样做without using arrays, bit operations。虽然您的解决方案使用较小的数组,但它仍然使用数组和位操作。 嗯,没看到位操作部分,不好意思:(【参考方案4】:
// ASCII assumed over unicode
// O(n) algorithm
// O(1) space
bool isUnique(string s) 
    // cannot exceed number of unique characters
    if (s.length() > 256) return false;
    bool checker[256];
    for (int i = 0; i < s.length(); i++) 
        int val = s.at(i);
        if (checker[val] == true)
            return false;
        checker[val] = true;
    
    return true;

【讨论】:

`int val = s.at(i);`究竟是做什么的? @Alex 它返回索引 i 处字符串的字符,然后将其转换为整数。您可以将其视为检查器的哈希键,因为每个字符都有自己唯一的整数。

以上是关于确定字符串是不是具有所有唯一字符的主要内容,如果未能解决你的问题,请参考以下文章

经典 ASP 中的正则表达式,以确定 URL 是不是具有特定字符串

我正在尝试创建一个函数来检查字符串中的所有字符是不是都是唯一的,如果是这样,则返回 0,如果不是所有字符都是唯一的,则返回 1

hash算法

确定字符串中的所有字符是不是相同

确定 vector<char> 中频率最高的 char 元素?

如何检查 DOM 中所有 div 的类名是不是具有带有 vanilla Javascript 的特定字符串?