给定一个由小写字母构成的字符串。
如果一个字母在字符串中出现不止一次,就称它是重字母,否则就称它是轻字母。
给定 $T$ 个长度为 $N$ 的字符串,请你判断每个字符串是否是轻重交替结构。
如果一个字符串中的任意两个相邻字符都不同为重或同为轻,就称该字符串为轻重交替结构。
输入格式
第一行包含整数 $T$,$N$。
接下来 $T$ 行,每行包含一个长度为 $N$ 的由小写字母构成的字符串。
输出格式
共 $T$ 行,其中第 $i$ 行输出对第 $i$ 个字符串的判断,如果是轻重交替结构,则输出 $\mathtt{T}$,否则输出 $\mathtt{F}$。
数据范围
$2 \leq T \leq 10000$
$2 \leq N \leq 100$
输入样例 1
3 4
abcb
bcbb
babc
输出样例 1
T
F
T
输入样例 2
2 3
abc
bcb
输出样例 2
F
T
需要记录每一个字母出现的次数并存储在 $\mathtt{cnt}$ 数组中。对于 $\mathtt{cnt}$ 数组,将每一个字母用如下函数转换为一个对应的整数用作数组下标:
int to_int(char c)
{
return c - 'a';
}
首先遍历字符串中的每一个字母,并记录每一个字母出现的次数:
for (int i = 1; i <= n; i++)
{
cnt[to_int(s[i])]++;
}
然后,重新遍历字符串,并检查相邻两个字母是否轻重交替。如果相邻两个字母不是轻重交替,则这两个字母:
-
都只出现了一次;
-
都出现了不止一次。
for (int i = 1; i <= n - 1; i++)
{
if ((cnt[to_int(s[i])] == 1 && cnt[to_int(s[i + 1])] == 1) ||
(cnt[to_int(s[i])] > 1 && cnt[to_int(s[i + 1])] > 1))
{
return false;
}
}
C++:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e2 + 10;
int t;
int n;
char s[N];
int cnt[26];
int to_int(char c)
{
return c - 'a';
}
bool solve(char s[])
{
memset(cnt, 0, sizeof(cnt));
for (int i = 1; i <= n; i++)
{
cnt[to_int(s[i])]++;
}
for (int i = 1; i <= n - 1; i++)
{
if ((cnt[to_int(s[i])] == 1 && cnt[to_int(s[i + 1])] == 1) ||
(cnt[to_int(s[i])] > 1 && cnt[to_int(s[i + 1])] > 1))
{
return false;
}
}
return true;
}
int main()
{
cin >> t;
cin >> n;
while (t--)
{
for (int i = 1; i <= n; i++)
{
cin >> s[i];
}
bool ok = solve(s);
if (ok)
{
cout << "T" << endl;
}
else
{
cout << "F" << endl;
}
}
return 0;
}