问题描述
小蓝用黑白棋的n个棋子排成一行,他在脑海里想象出了一个长度为n的01串T,他发现如果把黑棋当作1,白棋当作0,这一行棋子也是一个长度为n的01串S。
小兰决定,如果在S中发现一个棋子和他两边的棋子都不一样,就可以将其翻转变成另一个颜色。也就是说,如果S中存在字串101或010,就可以选择将其变成111和000,这样的操作可以无限重复。
小蓝想知道最少翻转多少次可以把S变成和T一模一样
输入格式
输入包含多组数据。输入的第一行包含一个正整数D包括数据组数/
后面2D行每行包含一个01串,每两行为一组数据,第2i-1 行为第i组数据的Ti,第2i行为第i组数据的Si, Si 和Ti 长度均为ni .
输出格式
对于每组数据,输出一行包含一个整数,表示答案,如果答案不存在请输入 -1
样例输入
2
1000111
1010101
01000
11000
样例输出
2
-1
解题思路
1.对于每一个不同的字符,根据题意他需要和两边的字符都不同才可以翻转,如果相同,那么无法进行翻转,输出-1即可
2.对于首字母和尾字母,由于左右两边缺少字符,所以一定无法比较,若不同,直接输出-1 即可
3.可以将s改成t的样例,直接输出操作步骤res即可
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
using namespace std;
const int N=1e6+10;
char s[N],t[N];
int main()
{
int T;
cin>>T;
while(T--)
{
scanf("%s%s",t,s); //接受两个字符串
int n=strlen(s); //记录字符串的个数
int res=0;
rep(i,0,n)
{
if(s[i]!=t[i]) //字符串不想等,需要改变
//无法改变时
if(!i || i==n-1 || s[i]==s[i-1] || s[i]==s[i+1])
{
res=-1;
break;
}
else
{
res++;
s[i]=t[i];
}
}
printf("%d\n",res);
}
return 0;
}
法2:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int d; cin>>d;
for(int i=0;i<d;i++)
{
string t,s;
cin>>t>>s;
int ans=0;
for(int j=1;j<s.length();j++)
{
if(s[j-1]==s[j+1]) //比较j字符串两边是否相等
{
if(s[j]!=s[j+1]) //j字符串与他们不相等
{
if(t[j]!=s[j]) //与原字符串相比较
{
s[j]=t[j];
ans++;
}
}
}
}
if(s.compare(t)) //比较整个字符串
cout<<-1<<endl;
else
cout<<ans<<endl;
}
return 0;
}