哎哟那个嘿


私信TA

用户名:657046415

访问量:5094

签 名:

等  级
排  名 8340
经  验 1237
参赛次数 0
文章发表 13
年  龄 0
在职情况 学生
学  校 肇庆学院
专  业

  自我简介:

解题思路: 这题解法很多,可以枚举也就是宽带的收索(利用队列)但是这一题也存在着规律,接下来让我们来看看要如何发现。


步骤1:先用已给例子进行推敲


其实蓝桥被原题给了两个例子

第一个:   **********
                o****o****

输出:5


规律:其实就是从第一个不同开始我们就开始翻,一直翻到下一个不同。如何我们可以试试两个不同之间差的个数:0个,奇数个

当我们考虑完这些情况发现,无论中间是隔着0个,偶数个,奇数个的情况,只要我们连着翻,就是这一段的最小次数。

那么全部次数,我们也就可以分割成这样一段一段计算啦


其实问题解决思路就是先解决这个问题的小规模数据,如何用你解决的方法在数据变化时看适用吗?需要如何变化。


注意事项:

1. 必须连着翻动,不如你中间原本一样的会变为不一样。

2. 那么有没有可能出现两段字符串有奇数个不同呢?

  一想就知道肯定不行,因为我们一次翻动的个数是两个,就是你一次翻动就会改变这个串两个字符,那么无聊你怎么翻,都是偶次数的改变。


参考代码:

#include<iostream>
using namespace std;
int main(){
	string s1;
	string s2;
	getline(cin,s1);
	getline(cin,s2);
	int n = s1.length();
	int ans = 0;
	int start = -1; 
	for(int i=0;i<n;i++){
		if(s1[i]!=s2[i]){ //发现不同
			if(start==-1){ //判断是不是“新的起点”,因为有多段
				start=i;
			}
			else //第二次发现,证明这是新起点后的第一个不同点
			{
				ans+=(i-start);
				start=-1; // 还原,为了发泄下一个”起点“做准备
			}
		}
	}
	cout<<ans;
	return 0;
}



 

0.0分

2 人评分

  评论区

讲的可能不是很清楚,大家见谅
2020-07-25 12:09:49
  • «
  • 1
  • »