题解
最长字符平台
1 条题解
-
0
解题思路
题目里的字符数组已经按 ASCII 码从小到大排好序了,所以相同的字符一定紧紧挨在一起,排成连续的一段。我们的任务就是找到最长的一段"连续相同字符",它就叫最长字符平台。
怎么找呢?我们可以从头到尾扫一遍,用一个"计数器"记录当前这一串相同字符有多长:
- 看下一个字符,如果它和当前字符一样,计数器就加 1,说明平台还在变长;
- 如果它和当前字符不一样,说明上一串结束了,重新以这个新字符开始,计数器从 1 数起。
每走一步,都要把当前这串的长度和"目前找到的最长长度"比一比。如果更长,就把它记下来(包括长度和这个字符)。
注意题目要求:如果有多个一样长的最长平台,要找先出现的那个。所以只有当前长度严格大于之前记录的长度时才更新;如果相等,就不更新,这样保留下来的永远是第一个出现的最长平台。
参考代码
// P4510 最长字符平台:在有序字符序列中找最长的连续相同字符段 #include <iostream> using namespace std; int main() { int n; cin >> n; char ch; cin >> ch; // 先读入第一个字符 char cur = ch; // 当前正在统计的字符 int len = 1; // 当前字符连续出现的长度 int bestLen = 1; // 找到的最长平台长度 char bestCh = ch; // 最长平台对应的字符 for (int i = 2; i <= n; i++) { cin >> ch; if (ch == cur) { len++; // 和上一个字符相同,平台继续加长 } else { cur = ch; // 遇到新字符,开始新平台 len = 1; } if (len > bestLen) { // 只有严格更大才更新,保证取先出现的 bestLen = len; bestCh = cur; } } cout << bestLen << endl; cout << bestCh << endl; return 0; }复杂度分析
我们只把 n 个字符从头到尾看了一遍,所以时间复杂度是 O(n)。只用几个变量来记录状态,不随 n 增加而增加,所以空间复杂度是 O(1)。
- 1