题目描述
农夫约翰给了奶牛贝西 Q 个新字符串,其中只有字符 M 和 O ,她想将 Q 个字符串都变成 MOO。贝西可以用如下的方式改变字符串:
1.用相反的字符替换第一个或最后一个字符(将 M 变成 O ,将 O 变成 M )。 2.删除第一个或最后一个字符。
贝西只想用最少的次数完成改变。请你帮她找到需要的最小改变次数。如果不可能在有限的步数中完成这个任务,请输出 -1 。
输入格式
输入数据的第一行是一个正整数 Q 。(1≤Q≤100) 接下来的 Q 行中,每行一个只包含大写字母 M 或 O 的字符串 S ,保证 1≤∣S∣≤100 (∣S∣指字符串长度)。
输出格式
输出 Q 行,每行为该测试点最小操作次数,如果不可能在有限的步数中完成这个任务,请输出 -1 。
样例输入
3 MOMMOM MMO MOO
样例输出
4 -1 0
提示
将第一个字符串转换为 MOO的 4 个操作序列如下:
用O替换最后一个字符(操作1) 删除第一个字符(操作2) 删除第一个字符(操作2) 删除第一个字符(操作2)
可以证明,第二个字符串无法转换为 MOO。第三个字符串已经是 MOO,因此无需执行任何操作。
样例代码_有注释
#include<bits/stdc++.h>
using namespace std;
int T, ans;
char s[1010], t[1010];
int main(){
scanf("%d", &T);
while (T --) {
ans = 100000;
scanf("%s", s);
if (strlen(s) < 3) {
printf("-1\n");
continue;
}
for (int i = 0; i < strlen(s) - 2; i ++) {
t[0] = s[i]; t[1] = s[i+1]; t[2] = s[i+2]; // 截取连续的3个字符
if (t[0] == 'M' && t[1] == 'O' && t[2] == 'O') ans = strlen(s) - 3; // 存在MOO,只需删除多余部分
else if (t[0] == 'M' && t[1] == 'O' && t[2] == 'M') ans = min(ans, (int)(strlen(s) - 2));// MOM, 删除多余之后还需要1步操作
else if (t[0] == 'O' && t[1] == 'O' && t[2] == 'O') ans = min(ans, (int)(strlen(s) - 2));// OOO, 删除多余之后还需要1步操作
else if (t[0] == 'O' && t[1] == 'O' && t[2] == 'M') ans = min(ans, (int)(strlen(s) - 1));// OOM, 删除多余之后还需要2步操作
}
if (ans == 100000) ans = -1; // 没有找到一个可变化的3个连续的字符
printf("%d\n", ans);
}
return 0;
}