字符串删减
原题
双指针
#include <iostream>
using namespace std;
int main() {
int n;
string s;
cin >> n >> s;
int res = 0;
for (int i = 0; i < n; i ++ ) {
if (s[i] != 'x') {
continue;
}
int j = i + 1;
while (j < n && s[j] == 'x') {
j ++ ;
}
res += max(0, j - i - 2);
i = j - 1;
}
cout << res << endl;
return 0;
}
测试数据
9
xxxaxxxxx
8
xxaxxxxx
模拟
- 我们利用 cntcnt 存储当前连续出现字符 xx 的个数;
- 若出现了一个字符 x,则 cnt 加一;
- 若出现了一个其它字符,则 cnt 清零;
- 若当前 cnt=3,说明遇到了连续三个 xx,此时需要删除一次。特别地,此时删除最后一个字符 xx 后,可能“补位”的字符仍为 x,如输入样例 3 所示。此时不能将 cnt 清零,而应该减一,然后继续遍历
#include <iostream>
using namespace std;
int main() {
int n;
string s;
cin >> n >> s;
int res = 0, cnt = 0;
for (int i = 0; i < n; i ++ ) {
if (s[i] == 'x') {
cnt++;
if (cnt == 3) {
res++, cnt--;
}
} else {
cnt = 0;
}
}
cout << res << endl;
return 0;
}