#3. MOO字符串

题目描述

农夫约翰给了奶牛贝西 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;
}

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

停暮_星月志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值