您的位置:首页 > 其它

指定的字符串的大小写排列组合

2015-12-10 00:00 134 查看
摘要: 对指定的字符串进行大小写排列实现

算法解析.

例如字符串有"abcd"
那么我可以这样实现: 因为字符是区分大小写的,那么可以采用二叉树的方式来实现.
实现步骤如下:

a, A
ab, aB, Ab, AB
abc, abC, aBc, aBC, Abc, AbC, ABc, ABC
abcd, abcD, abCd, abCD, aBCd, aBCD, Abcd, AbcD, AbCd, AbCD, ABcd, ABcD, ABCd, ABCD







3. 实现

#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

void strToLower(const std::string& str, std::string& target)
{
for (size_t i = 0; i < str.size(); ++i) {
if (islower(str[i])) {
target += str.at(i);
}
else {
target += tolower(str.at(i));
}
}
}

std::string Convert(char c)
{
std::string str;
str += tolower(c);
str += toupper(c);

return str;
}

void test(const std::string& str)
{
if (str.empty()) {
return;
}

size_t length(0);
std::vector<std::string> strList;
std::string strChar = Convert(str.at(0));
for (size_t i = 0; i < strChar.size(); ++i) {
strList.push_back(std::string(1, strChar.at(i)));
}
for (size_t i = 1; i < str.size(); ++i) {
std::string strChar = Convert(str.at(i));
std::vector<std::string> strListTemp;
for (size_t k = 0; k < strList.size(); ++k) {
for (size_t j = 0; j < strChar.size(); ++j) {
std::string strTemp = strList[k];
strTemp += strChar.at(j);
strListTemp.push_back(strTemp);
++length;
}
}
strList = strListTemp;
}

// test
for (size_t i = 0; i < strList.size(); ++i) {
std::cout << strList[i] << "\t";
}
std::cout << std::endl;
std::cout << "total length: " << length << std::endl;   //length = 124
}

void test2(const std::string& str)
{
std::string strTemp;
//strToLower(str, strTemp);
strTemp = str;
size_t strsize = strTemp.size();
size_t count = 1 << strsize;
size_t length(0);
for (size_t i = 0; i < count; ++i) {
for (size_t j = 0; j < strsize; ++j) {
int bit = (i >> j) & 1;
//printf("%ld\t", i >> j);
strTemp.at(j) = bit ? tolower(strTemp.at(j)) : toupper(strTemp.at(j));
++length;
}

printf("%s\t", strTemp.c_str());
}
printf("total count: %ld\n", length);   //length = 384
}

int main()
{
std::string str = "aBcDEF";
test(str);
test2(str);
return 0;
}

其中test2()是网络上其他人的实现具体见(http://www.oschina.net/question/1022558_2144600)
比较test() 与 test2();
test() 主代码执行124次;
test2()主代码执行384次.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: