[Daimayuan] 最长的 X(C++,字符串)

给定一个由 X. 组成的字符串 S S S

你能对字符串 S S S 做以下操作 0 0 0 K K K 次(包括 0 0 0 K K K):

将一个 . 替换为 X

请问操作完的字符串 S S S 中最多可能有多少个连续的 X

输入格式

第一行一个字符串 S S S

第二行一个整数 K K K

输出格式

一个整数,表示答案

样例输入1

XX...X.X.X.
2

样例输出1

5

样例输入2

XXXX
200000

样例输出2

4

数据规模

对于全部数据保证 1 ≤ ∣ S ∣ ≤ 2 × 1 0 5 1≤|S|≤2×10^5 1S2×105 0 ≤ K ≤ 2 × 1 0 5 0≤K≤2×10^5 0K2×105

解题思路

采用伪代码来说明解题思路:

while (r_idx != str.size()) {//尝试拓展连续X长度
    if (str[r_idx] == 'X') {//正常拓展
        ...
    }
    else {//操作后拓展
        ...
    }
}

对于操作后拓展,我们进一步将其分为两种情况:

while (r_idx != str.size()) {//尝试拓展连续X长度
    if (str[r_idx] == 'X') {//正常拓展
        ...
    }
    else {//操作后拓展
        if (/* 累计操作达到k次 */) {
            ans = max(ans, temp);//更新答案
            while (str[l_idx] != '.') {//从头部去除一个'.'
                ...
            }
        }
        else {//成功操作
            ...
        }
    }
}

大致思路说明完毕,有一些容易出现的逻辑漏洞在下面的代码中说明。

AC代码如下:

#include 
using namespace std;

int main() {
	string str;
	int k, cnt = 0;
	cin >> str >> k;
	int ans = 0, temp = 0, l_idx = 0, r_idx = 0;
	while (r_idx != str.size()) {
		if (str[r_idx] == 'X') {
			temp++;
			r_idx++;
		}
		else {
			if (cnt == k) {
				ans = max(ans, temp);
				while (str[l_idx] != '.') {
					temp--;
					l_idx++;
				}
				if (l_idx != r_idx) {
					temp--;
					cnt--;
					l_idx++;
				}
				else {//当k == 0时,会出现l_idx == r_idx的情况
                    //这时需要强制推进,否则会卡住,进入死循环
					l_idx++;
					r_idx++;
				}
			}
			else {
				temp++;
				cnt++;
				r_idx++;
			}
		}
	}
	ans = max(ans, temp);//当k >= '.'的数量时,会导致答案未被更新,在这里进行更新
	cout << ans << endl;
	return 0;
}

你可能感兴趣的:(字符串,c++,算法,开发语言,字符串)