# 距离 ### 题目描述 蒜头君最近获得了一个字符串 `str`,这个字符串只由**小写字母**构成。 蒜头君不仅是一个数学能手,英语学的更是不错,他对于 $26$ 个英文字母非常敏感。 蒜头君发现,相同字母(如果存在)在字符串中有一个距离,比如字符串 `abca`,字母 `a` 的距离为 $3$(索引之差的绝对值)。 距离的定义:字符串中相对位置相邻的两个相同字母之间的距离。如果位置 $i$ 的字母与位置 $j(i < j)$ 的字母之间存在距离,那么需要满足 `str[i] == str[j]` 且 $i+1 \sim j - 1$ 之间可以有其他字母但是不能有与 `str[i]` 相同的字母。 对于字符串 `abcasdva`,则有三个字母 `a`,第一个 $a$ 和第二个 `a` 之间的距离为 $3$,第二个 `a` 和第三个 `a` 之间的距离为 $4$。第一个 `a` 和第三个 `a` 之间**没有距离**。 现在蒜头君把他的字符串给你了,你能够找到字符串字母之间的**最大距离**吗? 如果字符串中,所有的字母都不相同,那么最大距离为 $0$。 ### 输入格式 输入共两行。 第一行输入一个正整数 $n$,表示字符串的长度。 第二行输入一个长度为 $n$ 的字符串 $str$。 ### 输出格式 输出共一行。 输出一个数,表示字符串字母之间的最大距离。 ### 数据范围 对于 $10\%$ 的数据,有 $1\leq n\leq 10$,且字符串中的字母互不相同。 对于另外 $20\%$ 的数据,有 $1\leq n\leq 100$,且字符串中只有两种字母。 对于 $100\%$ 的数据,有 $1\leq n\leq 10^3$。
### 题解 依次枚举每一个字母,然后寻找**下一个**与它相同的字母,并且维护距离的最大值。 注意,如果找到下一个与该字母相同的字母,维护后就需要通过`break`结束当前寻找的循环。 ```c++ int ans = 0; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (str[i] == str[j]) { ans = max(ans, j - i); break; // 注意这个 break } } } ``` #### 参考代码 ```c++{.line-numbers} #include using namespace std; int main() { int n; string str; cin >> n; cin >> str; int ans = 0; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (str[i] == str[j]) { ans = max(ans, j - i); break; } } } cout << ans << endl; return 0; } ```