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
https://hackmd.io/@PeterWang/APCS%E5%9F%BA%E5%9C%B0%E5%8F%B0
謝謝您的指教,只是您似乎留錯篇文章了,所以我修改了您的留言並保留網站,還請見諒