算法解析.
例如字符串有"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次.