APCS程式檢測 -實作題1061028 第2題 交錯字串

APCS程式檢測 -實作題1061028 第2題 交錯字串

本題會使用到 C++ 的 STL vector,如果不熟悉的話可以來這裡看看
https://husking-studio.com/cpp-stl-vector/

將連續幾個大寫和小寫的數量存起來

完整程式碼

#include <iostream>
#include <cctype>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

int GatAlternateCount(vector<int> vecAlphabeta, int K, int nCurrent);

int main()
{
	//輸入 K
	string strInput;
	getline(cin, strInput);
	int K = stoi(strInput);

	//
	string str;
	getline(cin, str);

	bool bOldLower = false;		//上一個字母
	bool bLower = false;		//現在的字母
	vector<int> vecAlphabeta;	//紀錄字串的連續大小寫數量

	//處理第一個字母
	if (isupper(str[0]))		//大寫
	{
		bLower = false;
		bOldLower = bLower;
	}
	else if (islower(str[0]))	//小寫
	{
		bLower = true;
		bOldLower = bLower;
	}
	vecAlphabeta.push_back(1);
	
	//處理接下來的字母
	for (int i = 1; i < (int)str.length(); i++)
	{
		if (isupper(str[i]))		//大寫
			bLower = false;
		else if (islower(str[i]))	//小寫
			bLower = true;

		if (bLower == bOldLower)	//和前一個相同
			vecAlphabeta[vecAlphabeta.size() - 1]++;
		else
			vecAlphabeta.push_back(1);

		bOldLower = bLower;
	}

	//
	int nCurrent = 0;
	int nCnt = 0;
	int nMaxCnt = nCnt;

	while (nCurrent < (int)vecAlphabeta.size())
	{
		if (vecAlphabeta[nCurrent] >= K)
		{
			nCnt = GatAlternateCount(vecAlphabeta, K, nCurrent);

			//找到幾個連續,就讓 nCurrent 向下移動
			if (nCnt > 1)
			{
				for(int j = 0 ; j < (nCnt-1) ; j++)
					nCurrent++;
			}

			if (nCnt >= nMaxCnt)
				nMaxCnt = nCnt;
		}

		nCurrent++;
	}
	
	cout << nMaxCnt * K << endl;

	system("pause");
	return 0;
}

int GatAlternateCount(vector<int> vecAlphabeta, int K, int nCurrent)
{
	int nCnt = 1;

	while (nCurrent < (int)vecAlphabeta.size())
	{
		if (nCurrent == (int)vecAlphabeta.size()-1)	//現在這個 是最後一個
		{
			if (vecAlphabeta[nCurrent] > K)		//現在這個 大於K
				nCnt = 0;

			break;
		}
		else
		{
			if (vecAlphabeta[nCurrent + 1] < K)		//下一個 小於K
			{
				if (vecAlphabeta[nCurrent] > K)		//現在這個 大於K
					nCnt = 0;

				break;
			}
			else if (vecAlphabeta[nCurrent + 1] > K)	//下一個 大於K
			{
				nCnt++;
				break;
			}
			else	//下一個 等於K
			{
				nCnt++;
				nCurrent++;	//迴圈繼續
			}
		}
	}
	return nCnt;
}

在〈APCS程式檢測 -實作題1061028 第2題 交錯字串〉中有 2 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *