区分大小写的字符串排序
字符串是用于存储各种字母和符号的存储元素。它表示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) 时间复杂度解决方案,该方案只需要维护两个数组并使用计数数组解决问题。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP