计算字符串中每个字符的出现,而不使用C ++中的count

时间:2017-10-28 19:19:12

标签: c++ string unique

这是我的代码:

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

void calc(string s){
    for(int i = 0;i < s.size();++i){
        int count = 1;
        for(int j = i + 1;j <s.size();++j){
            if(s[i] == s[j]){
                count += 1;
            }
        }
        cout << s[i] <<"(" << count << ")" << " ";
    }

}


int main(){
    string str;
    while(cin >> str){
        calc(str);
    }

}

一切正常,除了我想迭代字符串中的唯一字符,我不知道如何实现它。 你能帮帮我吗?

3 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。以下是一些建议:

  1. 修改您编写的代码,以便在计算字符在当前字符之后出现的次数之前,首先扫描字符串中的字符,看看它们中是否有匹配。如果是,请跳过当前字符。

  2. 每次找到与当前字符匹配的字符时,请将其替换为字符串中第一个字符的副本。然后,每当您访问字符串中不在第一个位置的字符时,请检查它是否与字符串中的第一个字符匹配。如果是这样,你已经扫描过了。如果没有,请计算其出现次数。

  3. 维护将字符映射到其频率的辅助数据结构(数组,哈希表等)。通过对原始字符串进行一次传递来填写表格,然后遍历具有唯一键的表格,以打印出所有内容。

  4. 对字符串进行排序。计算每个字符出现的次数,然后归结为查找字符串中每个连续字符的长度。

  5. 如果您不能修改原始字符串并且不允许使用其他数据结构,则选项(1)是好的。如果允许修改原始字符串,则选项(2)具有出色的时间和空间要求。选项(3)可能是最容易编码的,但比其他方法使用更多的空间。选项(4)也很容易编码,如果你使用像heapsort这样的东西,它具有良好的内存使用率,但仍然比选项(2)渐近地慢。

答案 1 :(得分:0)

为什么不保持26长度的辅助数组,将其初始化为0,然后每次遇到一个字符时将相应的索引值增加1?

伪代码:

auxArray[26] = [0] // 26 length array initialized to zero
for character in string: // loop through every character in the string
    auxArray[character - 'a']++; //increment the corresponding index value by 1

print auxArray //print the entire array. [0] will give you count of 'a', and [25] will give you count of 'z'

这假设你有一个从'a'到'z'的字符串(全部小写)。

如果我们也有一个大写 - 小写的字符混合,你可能类似的东西,但使用128的数组。在这种情况下,你不必减去'a'因为它是正在完成以使用字符来容纳索引。

auxArray[128] = [0]
for character in string:
    auxArray[character]++;

for index in auxArray:
    print(((char)index) + " Count is " + auxArray[index])

答案 2 :(得分:0)

另一种方法是使用std::map

std::map<char,int> count;

for (int i = 0; i < s.size(); ++i)
    count[s[i]]++;
for (auto iter = s.begin(); iter != s.end(); ++iter)
    std::cout << iter->first << “: “ << iter->second << ‘\n’;

未经测试,抱歉。