區分大小寫的字串排序


字串是用於儲存各種字母和符號的儲存元素。它表示C++中的一串字元。字串用雙引號或單引號表示。

給定的輸入字串可以包含大寫和小寫字元。問題陳述是更改字串字元的大小寫,以便最初以小寫形式編寫的字母轉換為大寫,反之亦然。一些說明問題陳述的示例如下:

示例

示例 1:"AbCd"

輸出:bAdC

輸出字串中字元的大小寫已交換。

可以使用兩種不同的方法解決問題陳述,它們是:

  • 使用STL

  • 使用計數陣列

方法 1:使用C++ STL

使用C++ STL,處理大小寫字元並將它們儲存在不同的向量中。然後使用這些向量訪問字串,然後透過從相應的向量中選擇所需的字母來修改字元大小寫。

語法

push_back()

此方法用於將元素插入呼叫的向量中。這會增加向量的尺寸。元素插入到向量的末尾。

vector.push_back(val)

引數

vector - 要插入值的向量

val - 要插入向量的值

演算法

  • 步驟 1 - 初始化兩個向量 upper 和 lower,分別儲存大寫和小寫字元。

  • 步驟 2 - 對向量 upper 和 lower 進行排序。

  • 步驟 3 - 遍歷輸入字串 str,可能出現以下兩種情況:

    • 如果遇到小寫字元,則使用指標 cnt1 獲取 upper 向量中的字元,然後遞增指標值。

    • 如果遇到大寫字元,則使用指標 cnt2 獲取 lower 向量中的字元,然後遞增該向量的指標值。

  • 步驟 4 - 然後返回最終的輸出字串。

示例

//including the required libraries
#include <bits/stdc++.h>
using namespace std;

// Function to return the sorted string
void casesorting(string str){
   int len = str.length();
   
   //vectors to store upper and lower case characters respectively
   vector<char> upper;
   vector<char> lower;
   
   //traversing the string
   for (int i = 0; i < len; i++) {
      char ch = str[i];
      
      //if upper case character
      if (ch >= 'A' && ch <= 'Z')
      
      //store in upper vector
      upper.push_back(str[i]);
      
      //if lower case character
      if (ch >= 'a' && ch <= 'z')
      
      //store in lower vector
      lower.push_back(ch);
   }
   
   //performing sorting
   sort(lower.begin(), lower.end());
   sort(upper.begin(), upper.end());
  
   //declaring two counters for two vectors
   int cnt1 = 0, cnt2 = 0;
   for (int i = 0; i < len; i++) {
      char ch = str[i];
      
      //if lower case
      if (ch >= 'a' && ch <= 'z') {
        
         //pick character from upper vector
         str[i] = upper[cnt1];
         cnt1++;
      }
      
      // Else pick the uppercase character
      else if (ch >= 'A' && ch <= 'Z') {
         str[i] = lower[cnt2];
         cnt2++;
      }
   }
   
   //print the string
   cout << "\nCase specific sorting of string : "<<str;
}
int main(){
  
   //input string
   string str = "lEaRNAtTutoRIaLPoIntS";
   cout<<"Entered String:"<<str;
  
   //calling the method
   casesorting(str);
   return 0;
}

輸出

Entered String:lEaRNAtTutoRIaLPoIntS
Case specific sorting of string : AaEalnIoILNotPttRuRS

方法 2:使用計數陣列

此方法使用兩個陣列 lower 和 upper,其容量為 23 個字元。每個字元的小寫計數儲存在 lower 陣列中,大寫字元計數分別儲存在 upper 陣列中。

演算法

  • 步驟 1 - 初始化兩個陣列 upper 和 lower,分別儲存大寫和小寫字元的計數。

  • 步驟 2 - 遍歷輸入字串 str,可能出現以下兩種情況:

    • 如果遇到小寫字元,則使用指標 cnt1 獲取 upper 陣列中計數 > 0 的字元。

    • 遞減此特定字元的計數。如果計數變為零,則遞增計數器值 cnt1。

    • 如果遇到大寫字元,則使用指標 cnt2 獲取 lower 陣列中計數 > 0 的字元。

    • 遞減此特定字元的計數。如果計數變為零,則遞增計數器值 cnt2。

  • 步驟 3 - 然後返回最終的輸出字串。

示例

//including the required libraries
#include <bits/stdc++.h>
using namespace std;

// Function to return the sorted string
void casesorting(string str){
   int len = str.length();
   int numchar = 26;
  
   //store lower and upper case character count
   //initialising the arrays with 0
   int lower[numchar]={0};
   int upper[numchar]={0};
   
   //traversing the string
   for(int i = 0; i < len;i++){
   
      //accessing the character
      char ch = str[i];
      
      //if upper case character
      if(ch>='A' && ch<='Z')
         upper[ch-'A']++;
      else
      
         //if lower case character
         lower[ch-'a']++;
   }
   
   //output string
   string ostr= "";
   
   //initialising the counters for upper and lower array
   int cnt1=0;
   int cnt2=0;
   for(int i = 0; i < len ;i++){
      char ch = str[i];
      
      //check if lower case character
      if(ch>='a' && ch<='z'){
        
         //check if count of current char is more than 0
         if(lower[cnt1]>0){
            char temp = (char)('a'+cnt1);
            ostr+=temp;
         
            //decrement count of current char
            lower[cnt1]--;
         } else {
            
            //if current count of character is 0
            while(cnt1<26 && lower[cnt1]==0){
               cnt1++;
            }
           
            //appending character to string
            char temp = (char)('a'+cnt1);
            ostr+=temp;
           
            //decrement count of current char
            lower[cnt1]--;
         }
      } else {
         if(upper[cnt2]>0){
            ostr+=(char)('A'+cnt2);
            upper[cnt2]--;
         } else {
            while(cnt2<26 && upper[cnt2]==0){
               cnt2++;
            }
            char temp = (char)('A'+cnt2);
            ostr+=temp;
            upper[cnt2]--;
         }
      }
   }
  
   //print the string
   cout << "\nCase specific sorting of string : "<<ostr;
}
int main(){
   
   //input string
   string str = "HeYa";
   cout<<"Entered String:"<<str;
   
   //calling the method
   casesorting(str);
   return 0;
}

輸出

Entered String:HeYa
Case specific sorting of string : HaYe

結論

大小寫轉換是C++字串的一個重要方面。區分大小寫的排序只是用於提供字元原始大小寫的反轉。最佳方法是使用 O(n) 時間複雜度解決方案,該方案只需要維護兩個陣列並使用計數陣列解決問題。

更新於:2023年3月15日

瀏覽量:328

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告