在给定的字符串中按出现的顺序打印字符及其频率,但是我无法理解行“ freq [str [i]-'a'] ++;”

时间:2018-09-27 17:05:01

标签: c++ lexicographic

Print characters and their frequencies in order of occurrence

如果您想了解其他详细信息,这是整个程序链接

下面是程序

void printCharWithFreq(string str) 
  { 

int n = str.size(); 

// 'freq[]' implemented as hash table 
int freq[SIZE]; 

// initialize all elements of freq[] to 0 
memset(freq, 0, sizeof(freq)); 

// accumulate freqeuncy of each character in 'str' 
for (int i = 0; i < n; i++) 
    freq[str[i] - 'a']++;   //**cannot understand this line**

// traverse 'str' from left to right 
for (int i = 0; i < n; i++) { 

    // if frequency of character str[i] is not 
    // equal to 0 
    if (freq[str[i] - 'a'] != 0) { 

        // print the charcter along with its 
        // frequency 
        cout << str[i] << freq[str[i] - 'a'] << " "; 

        // update frequency of str[i] to 0 so  
        // that the same character is not printed  
        // again 
        freq[str[i] - 'a'] = 0; 
    } 
  } 

}

1 个答案:

答案 0 :(得分:3)

因此,在尝试理解代码时,就像在代数中一样,由内而外地开始: freq[str[i] - 'a']++; 所有字符均表示为整数值。甚至Unicode的扩展字母都包括旧的ASCII表,其值为0-255(如何将字符表示为8位整数)。

ASCII值表:

enter image description here

str[i]是字符串的第i个字母,与C / C ++中的数组相同,因此可以使用从[0][n]的括号表示法来访问它。 ,其中n==str.size();

freq[]是一个数组,我们将在其中存储每个字母的频率计数,这些数字由memset(freq, 0, sizeof(freq));命令在每个插槽中初始化为0。 freq[]数组中每个插槽的索引对应于一个数字表示,即“该字母比小写字母“ a”大多少”。 (注意:我从此实现中假定,字符串输入str将全部为小写字母(无大写,标点或数字)。因此,freq[0]对应于字符“ 0”的计数大于“ a””或“ a”本身。可以在freq[1]中找到“ b”的计数,在freq[2]中找到“ c”的计数,依此类推,直到freq [25]保持z的计数。

因此,freq[str[i] - 'a']寻址freq[]数组中与相应字母相对应的插槽。 我们在该插槽中获取值并将其递增1,因为我们刚刚在str [i] 处发现了该字符。请记住,在第一个for循环的开始,该循环包含我们正在分析的代码行,所有计数均为0。编写方式就是您引用的那段代码:freq[str[i] - 'a']++;