这段代码中的arr[s[i]-'a']有什么用,为什么我们用"a"减去所有字符?

What is the use arr[s[i]-'a'] in this code and why we subtracting all characters with 'a'?

本文关键字:段代码 我们 为什么 字符 什么 代码 arr      更新时间:2023-10-16

有人可以解释一下下面代码中++arr[s[i]-'a'];逻辑的含义是什么吗?为什么我们要用"a"减去每个字符?

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n;
cin >> n;
for(int a0 = 0; a0 < n; a0++){
string s;
cin >> s;
int c=0;
vector <int> arr(26,0);
for(int i=0;i<s.length();i++){
++arr[s[i]-'a'];
}
for(int j=0;j<26;j++){
if(arr[j]!=0)
c++;
}
cout<<c<<endl;
}
return 0;
}

这是将字母转换为其相应数值的常用方法,从 0(对于"a"(到 25(对于"z"(。由于"a"等于"a",因此'a'-'a'将为零。由于"b"比"a"大一,'b'-'a'将是一。等等。

它使用一行来计算单词中字母的出现次数。让我们看一下这个细分:

first[a[c]-'a']++;

  1. a[c] - 'a' 得到字母字符的数字表示,所以想象一下,如果 a[c] 是 'b',我们会得到数字 1。

  2. first[a[c] - 'a'] 首先在字母的位置访问数组。

  3. 首先[a[c] - 'a']++是该位置的数字递增。

因此,如果您遇到"b",您的列表将如下所示:

"{0, 1, 0, ...">

你的代码计算字符串中的小字母。用于限制仅使用小写字母 -'a'。那 26 个字母只存储在向量中。