區分大小寫的字串排序
字串是用於儲存各種字母和符號的儲存元素。它表示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) 時間複雜度解決方案,該方案只需要維護兩個陣列並使用計數陣列解決問題。