C++中两个大写字母之间最多不同的的小写字母


给定任务是在给定的字符串中找到两个大写字母之间存在最大数量的不同小写字母。

让我们用一个例子来理解我们必须做什么:

输入

str = “JKyubDoorG”

输出

3

解释

“yub”位于两个大写字母K和D之间,计数为3。

“oor”也位于两个大写字母D和G之间,计数为2,因为‘o’是重复的字母,我们正在寻找不同的字母。

因此,输出为3。

输入

str = “ABcefsTaRpaep”

输出

4

下面程序中使用的算法如下:

  • 在函数Max()中,初始化int **size** = s.length() 来存储给定字符串的长度。

  • 循环从i = 0到i<size,并检查if (s[i] >= 'A' && s[i] <= 'Z')。如果是,则递增 **I** 并中断;

  • 初始化int **ans** = 0 来存储最终答案,另一个数组cnt[26] = {0}。

  • 循环从i = 0到i<size,然后检查if (s[i] >= 'A' && s[i] <= 'Z') 来检查当前字母是否为大写字母。如果是,则初始化int **CurrMax** = 0 来存储当前最大值。

  • 循环从i = 0到i<26,并检查if (cnt[i] > 0)。如果是,则递增CurrMax。

  • 在for循环之外,通过ans = max(ans, CurrMax);更新 **ans**,并使用memset(cnt, 0, sizeof(cnt));重置cnt[]数组。

  • 关闭上面的if()语句,并检查if (s[i] >= 'a' && s[i] <= 'z')。如果是,则递增cnt[s[i] - 'a']。

  • 关闭for循环并返回ans。

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
int Max(string s){
   int size = s.length();
   // Ignore the lowercase alphabets in beginning
   for (int i = 0; i < size; i++){
      if (s[i] >= 'A' && s[i] <= 'Z'){
         i++;
         break;
      }
   }
   int ans = 0;
   int cnt[26] = { 0 };
   for (int i = 0; i < size; i++) {
      // If alphabet is uppercase,
      if (s[i] >= 'A' && s[i] <= 'Z'){
         //Counting all lower case
         //distinct alphabets
         int CurrMax = 0;
         for (int i = 0; i < 26; i++){
            if (cnt[i] > 0)
               CurrMax++;
         }
         // Update ans
         ans = max(ans, CurrMax);
         // Reset count array
         memset(cnt, 0, sizeof(cnt));
      }
      // If alphabet is lowercase
      if (s[i] >= 'a' && s[i] <= 'z')
         cnt[s[i] - 'a']++;
   }
   return ans;
}
// Driver function
int main(){
   string str = "JKyubDoorG";
   cout << Max(str);
   return 0;
}

输出

3

更新于:2020年8月4日

239 次浏览

开启你的职业生涯

完成课程后获得认证

开始学习
广告