mrc*_*owl 38
如果你在谈论ASCII字符串:
创建一个int数组[0-255],每个字符索引一个,初始化为零.
循环遍历字符串中的每个字符,并递增该字符的相应数组位置
如果数组位置已包含1,则表示已遇到该字符.结果=>不唯一.
如果到达字符串的末尾而没有出现(3),则Result =>字符串是唯一的.
使用您选择的算法(例如内置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)
制作一组字母,然后计算值。
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)