A. Mike and palindrome(Codeforces 798A)
思路
本题的入手点为“恰好改变一个字符”。
因为能且仅能改变一个字符,所以可以枚举被改变的字符,接着尝试将其改变成任意跟原字符不同的字符,然后判断新的字符串是否是回文串。
注意,每次判断完新字符串是否是回文串后要将字符串改回原串,这样才不会影响下次修改。
代码
#include <bits/stdc++.h>
using namespace std;
string s, t;
int n;
// 判断字符串是否是回文串
bool isP(string s) {
n = s.size();
for(int i = 0; i < (n + 1) / 2; i++) {
if(s[i] != s[n - i - 1]) {
return false;
}
}
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> s;
n = s.size();
t = s;
// 枚举被改变的字符
for(int i = 0; i < n; i++) {
// 枚举改变成的字符
for(int j = 0; j < 26; j++) {
if(s[i] == 'a' + j) {
continue;
}
t[i] = 'a' + j;
if(isP(t) == true) {
puts("YES");
return 0;
}
// 要改回去,不然影响下次判断
t[i] = s[i];
}
}
puts("NO");
return 0;
}
B. Mike and strings(Codeforces 798B)
思路
本题的入手点是,给的字符串数量并不多,于是可以用暴力的方法处理。
可以证明,选定某个字符串,将其它字符串都改成它,这一定是最优的策略。那么我们可以枚举这个“模板”字符串 Si ,接着可以计算出每个字符串改变成它所需要的操作次数 Resi ,然后将 Resi 跟当前最优解 ans 比较并且更新。
枚举的复杂度是 O(n) ,将字符串做一系列操作以确定是否能变成模板串的复杂度是 O(n2) (因为字符串不是用链表存储的,所以删除首字符的复杂度为 O(n) ),比较两个字符串是否相等的复杂度为 O(n) 。于是总的复杂度就是 O(n4