确定一个字符串是否包含所有唯一字符?

mr_*_*air 12 c string algorithm unique

任何人都可以告诉我如何实现一个程序来检查包含所有唯一字符的字符串?

mrc*_*owl 38

如果你在谈论ASCII字符串:

  1. 创建一个int数组[0-255],每个字符索引一个,初始化为零.

  2. 循环遍历字符串中的每个字符,并递增该字符的相应数组位置

  3. 如果数组位置已包含1,则表示已遇到该字符.结果=>不唯一.

  4. 如果到达字符串的末尾而没有出现(3),则Result =>字符串是唯一的.

  • 如果您正在谈论ASCII字符串,欢迎来到未来!我们可能还没有个人喷气背包,但我们确实有unicode! (5认同)
  • 如果你在谈论*ASCII*字符串,那么包含128个元素的数组就可以了.(实际上,在C字符串的情况下,127个元素就足够了,但不太方便.) (3认同)
  • +1我最喜欢这个!事实上,几年前我实际上已经实现了这种方式.我的记忆一定要去! (2认同)
  • 这实际上是作为面试问题给我的.这是我的答案,但我的采访者提出,可以使用一个位数组(或者,为了使它更容易,字符或字节)来节省内存,而不是一个int数组.它的O(1)搜索数组,如果您的索引是从您的char值映射的! (2认同)
  • 一个好的优化是检查字符串的长度是否小于或等于256(假设使用扩展的ASCII),如果字符串大于则立即返回false.这里的整个想法是,当只有256个唯一字符可用时,您不能拥有300个字符的字符串.此代码的时间复杂度为O(n),空间复杂度为O(1) (2认同)

Mat*_*lia 7

使用您选择的算法(例如内置qsort函数)对字符串中的字符进行排序,然后扫描字符串检查连续的重复字母; 如果你没有找到任何结果,那么该字符串包含所有唯一字符.

另一种方法可能是使用一些结构,该结构对于字符串可能包含的每个字符都有一个桶,所有这些都初始化为零; 扫描字符串,增加与当前字符对应的存储桶的值.如果你增加一个已经有1的桶,你可以确定你的字符串包含重复项.

这可以与chars和一个数组(大小UCHAR_MAX+1)一起使用,但是当你开始处理宽字符时,它很快就会失控.在这种情况下,您需要一个哈希表或其他一些"严重"的容器.

最佳算法取决于要检查的字符串的长度,每个字符的大小,排序算法的速度以及分配/使用该结构来保存字符频率的成本.


小智 6

#include <iostream>
#include <string>
using namespace std;

bool isUnique(string _str)
{
        bool char_set[256];
        int len = _str.length();

        memset(char_set, '\0', 256);
        for(int i = 0; i < len; ++i)
        {
            int val = _str[i]- '0';
            if(char_set[val])
            {
                return false;
            }
            char_set[val] = true;
        }

        return true;
    }

    int main()
    {
        cout<<"Value: "<<isUnique("abcd")<<endl;
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)


Phi*_*l H 5

制作一组字母,然后计算值。

set("adoihgoiaheg")= set(['a', 'e', 'd', 'g', 'i', 'h', 'o'])

def hasUniqueLetters(str):
    return (len(set(str)) == len(str))

>>> hasUniqueLetters("adoihgoiaheg")
False
Run Code Online (Sandbox Code Playgroud)