【算法百题之二十四】幸运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,今天的博客就到这里,谢谢大家!!!