我没有找到任何特别的目的。 我试图找出一个计算每个角色的函数。在字符串中出现,以便我可以从长度中将它们拉出来,以找出该字符串中使用了多少个同类字符。
我尝试过嵌套循环,第一个是应用,第二个是扫描字符串,如果它没有出现在字符串的其他地方,则有条件地完成字符。 嗯,它没有奏效。
如果您愿意限制某人输入懒惰名称,例如" aaaaaaaaaaaaa"
,这非常有用。答案 0 :(得分:5)
这是一个简单的C ++解决方案:
int countDistinct(string s)
{
unordered_map<char, int> m;
for (int i = 0; i < s.length(); i++) {
m[s[i]]++;
}
return m.size();
}
答案 1 :(得分:2)
此方法具有O(n^2)
复杂度,但在O(n)
中执行此操作非常有可能(虽然有点复杂)。
int CountUniqueCharacters(char* str){
int count = 0;
for (int i = 0; i < strlen(str); i++){
bool appears = false;
for (int j = 0; j < i; j++){
if (str[j] == str[i]){
appears = true;
break;
}
}
if (!appears){
count++;
}
}
return count;
}
该方法迭代字符串中的所有字符 - 对于每个字符,它检查字符是否出现在任何前面的字符中。如果没有,则该字符是唯一的,并且计数递增。
答案 2 :(得分:1)
我在寻找Stack Overflow上的其他内容时碰到了这个问题。但是我仍然发布了一个可能对某些人有用的解决方案:
这也用于实现霍夫曼编码here。在那里,您需要知道每个字符的频率,因此比您需要的更多。
#include <climits>
const int UniqueSymbols = 1 << CHAR_BIT;
const char* SampleString = "this is an example for huffman encoding";
左移运算符向左移动lhs(即1)CHAR_BIT
次,因此乘以2 ^ 8(在大多数计算机上)为256,因为UTF-8中有256个唯一符号
并且在您的main
中
int main() {
// Build frequency table
int frequencies[UniqueSymbols] = {0};
const char* ptr = SampleString;
while (*ptr != '\0') {
++frequencies[*ptr++];
}
}
我发现它很小而且很有帮助。唯一的缺点是frequencies
的大小为256,因此唯一性就是检查哪个值是1。
答案 3 :(得分:1)
在O(n)
中,我发现了以下简单的计数不同字符的方法。
这里的逻辑是,遍历字符数组,对于每个字符
使它的计数为1
,即使重复,也仅用1
覆盖该值。
在完成遍历之后,只需对所有出现的字符求和即可。
int count_distinc_char(const char *a){
int c_arr[MAX_CHAR] = {0};
int i, count = 0;
for( i = 0; a[i] != '\0'; i++){
c_arr[a[i] - 'a'] = 1;
}
for( i = 0; i < MAX_CHAR; i++){
count += c_arr[i];
}
return count;
}
答案 4 :(得分:1)
您可以为此目的使用HashSet或unordered_set,但是最坏的情况下时间复杂度为O(N)。因此,最好使用256个内存位置或arr[256]
的数组。这样可以在O(256)〜O(1)的时间内给出所需的输出
答案 5 :(得分:0)
创建一个链接列表,用于存储字符串中找到的字符及其出现的节点结构,如下所示
struct tagCharOccurence
{
char ch;
unsigned int iCount;
};
现在逐个读取字符串中的所有字符,当您读取一个字符时检查它是否存在于链表中,如果是,则增加其计数,如果在链表中找不到字符,则插入一个新节点将'ch'设置为读取字符并将计数初始化为1。
通过这种方式,您只能在单次通过中获得每个角色的出现次数。 您现在可以使用链接列表打印字符的次数。
答案 6 :(得分:-1)
这里是C程序的源代码,用于计算唯一字数。 C程序已成功编译并在Linux系统上运行
int i = 0, e, j, d, k, space = 0;
char a[50], b[15][20], c[15][20];
printf("Read a string:\n");
fflush(stdin);
scanf("%[^\n]s", a);
for (i = 0;a[i] != '\0';i++) //loop to count no of words
{
if (a[i] = = ' ')
space++;
}
i = 0;
for (j = 0;j<(space + 1);i++, j++) //loop to store each word into an 2D array
{
k = 0;
while (a[i] != '\0')
{
if (a[i] == ' ')
{
break;
}
else
{
b[j][k++] = a[i];
i++;
}
}
b[j][k] = '\0';
}
i = 0;
strcpy(c[i], b[i]);
for (e = 1;e <= j;e++) //loop to check whether the string is already present in the 2D array or not
{
for (d = 0;d <= i;d++)
{
if (strcmp(c[i], b[e]) == 0)
break;
else
{
i++;
strcpy(c[i], b[e]);
break;
}
}
}
printf("\nNumber of unique words in %s are:%d", a, i);
return 0;