试题 D:填充
贪心法
从前往后遍历字符串 s
,采用贪心策略,当前有符合条件的就先满足。
遍历时考虑当前字符和下一个字符,此时会有以下四种情况:
-
数字 + 数字
此时比较这两个数字是否相等
-
数字 + ?
? 取与前面数字一样的数字,不论前面的数字是什么,该情况都可以满足条件
-
? + ?
由于 ? 可以任取,因此两个 ? 取相同值便可以满足条件
-
? + 数字
? 取与后面数字一样的数字,不论前面的数字是什么,该情况都可以满足条件
综上,当 s[i]
或 s[i+1]
中存在 ? 时,total++
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string s;
cin >> s;
int len = s.length();
vector<int> visited(len, false);
long total = 0;
for (int i = 0; i < len - 1; i++) {
if (visited[i]) continue;
if (s[i] == '?' || s[i + 1] == '?') {
total++;
visited[i] = visited[i + 1] = true;
} else if (s[i] == s[i + 1]) {
total++;
visited[i] = visited[i + 1] = true;
}
}
cout << total << endl;
return 0;
}