问题描述
问题:给定只包含字母的字符串,对其进行小写字母在前,大写字母在后的排序(LintCode 49.Sort Letters by Case)
注意:并不要求大写字母或小写字母按照字母序排列,例如:字符串“abAcD”排序后为“acbAD”
标签:Sort,String,两个指针等
解决思路
分析
本题借助划分Partition算法思想,不同之处在于快排中partition是比较每个数和基准值的大小进行位置交换,本题则是比较每个字母是否大小写进行位置交换。
算法示例
(附:已通过LintCode测试)
写法一:与第K大数类似,如下:
class Solution {
public:
/*
* @param chars: The letter array you should sort by Case
* @return: nothing
*/
bool isLower(char c) { //判断是否小写
return c >= 'a' && c <= 'z';
}
void sortLetters(string &letters) {
int i = 0, j = letters.size() - 1;
while(i<j){
while(i<j&&!isLower(letters[j]))
j--;
if(i<j){
char c = letters[i]; //交换
letters[i] = letters[j];
letters[j] = c;
i++;
}
while(i<j&&isLower(letters[i]))
i++;
if(i < j){
char c = letters[i]; //交换
letters[i] = letters[j];
letters[j] = c;
j--;
}
}
}
};
写法二:稍作修改,进行代码书写的简单优化,如下:
void sortLetters(string &letters) {
int i = 0, j = letters.size() - 1;
while (i <= j) {
while (i <= j && isLower(letters[i]))
i++;
while (i <= j && !isLower(letters[j]))
j--;
if (i <= j) {
char c = letters[i];
letters[i] = letters[j];
letters[j] = c;
}
}
}