【算法百题之二十四】20网易面试题-幸运N串

【算法百题之二十四】幸运N串

 

    大家好,我是Lampard~~

    很高兴又能和大家见面了,接下来准备系列更新的是算法题,一日一练,早日升仙!

 

    今天的问题是:

  小A很喜欢字母N,他认为连续的N串是他的幸运串。有一天小A看到了一个全部由大写字母组成的字符串,他被允许改变最多2个大写字母(也允许不改变或者只改变1个大写字母),使得字符串中所包含的最长的连续的N串的长度最长。你能帮助他吗?

 

思路:

在我们的到一个字符串的时候,我们需要使用一个有两个元素的数组a【2】来记录非N字母出现的位置。如果遍历了整个字符串数组还没满的话,则证明非N字符少于两个,直接输出字符串大小就可以。而如果数组在中途满了的话,则需要计算出字符串首到当前位置的长度,并用length记录,然后a【o】=a【1】,a【1】=当前位置,这样一来当下一个非N字母出现的时候就可以通过计算当前位置-a【0】来计算下一个长度。

char array[50000];
		cout << "请输入字符串" << endl;
		cin >> array;

		int m = 0;      // m是记录非N字母位置的下标
		int sum = 0;    // sum是N的个数
		int a[2];
		int length = 0; // length是之前最大串的长度,如果sum比length大,则更新length
		for (int i = 0; i < strlen(array); i++)
		{
			char c = array[i];
			if (c == 'N')
			{
				sum = sum + 1;
			}

			else if (c != 'N')
			{
				if (m < 2)
				{
					a[m] = i;
					m++;
					sum++;
				}
				else if (m == 2)
				{
					length = max(length, sum);
					sum = sum - a[0];
					a[0] = a[1];
					a[1] = i;
				}
			}
		}

新的长度要和旧的length比较,因为我们要找的是最长串,所以我们要保留大的那一个值。

最后我们看看结果:

 

   OK,今天的博客就到这里,谢谢大家!!!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lampard杰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值