题意为:
多组数据t。
每组给定一个整数n,和一个n个元素的字符串数组x。将字符串x分成两个非空字符串a和b,同时定义f(x)为字符串x中不同字符的数量,使得f(a)和f(b)是可能的最大值。
思路:我们可以先记录下字符串中不同的字母的个数,从而得知字符串中有多少个不同的字母。通过枚举使前1~i个字符为一组,后面i+1~n为一组。l为前面的字符串,k为字符串字母的顺序,l中下标为k的元素加1;r下标为k的元素减一;接着判断,如果r中下标为k的元素为零,则说明这个字母在r中不存在,便可以使总数pos减一,如果l中下标为k的元素为一,说明l中新增了一个新的字母,总数pos加一经历上述操作后,得到此时pos的值,通过之前的值,和现在的值对比可以得到所有操作的最大值,循环完便能得到最大值。
数据范围(2<=n<=1e5,1<=t<=1e4)
#include<iostream>
#include<cmath>
#include<algorithm>
#include<array>
#include<cstring>
using namespace std;
typedef long long ll;
const int ma = 2e5 + 3;
int main()
{
int t;
cin >> t;
while (t--)
{
int l[30], r[30];
memset(l, 0, sizeof l);
memset(r, 0, sizeof r);//清空数组l,r.
int n;
cin >> n;
string s;
int i;
cin >> s;
int pos = 0, sum = 0;
for (i = 0; i < n; i++)
{
r[s[i] - 'a']++;//记录字符串s中不同的字母个数;
}
for (i = 0; i < 27; i++)
{
if (r[i] > 0)
{
pos++;
}
}
int ans = 0;
for (i = 0; i < n; i++)
{
int k = s[i] - 'a';
l[k]++;
r[k]--;
if (r[k] == 0)
{
pos--;
}
if (l[k] == 1)
{
pos++;
}
ans = max(ans, pos);
}
cout << ans << endl;
}
return 0;
}