指定的字符串的大小写排列组合
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
图
![](http://static.oschina.net/uploads/space/2015/1210/231107_HGv8_90415.png)
![](http://static.oschina.net/uploads/space/2015/1210/231107_2xs0_90415.png)
3. 实现
算法解析.
例如字符串有"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
图
![](http://static.oschina.net/uploads/space/2015/1210/231107_HGv8_90415.png)
![](http://static.oschina.net/uploads/space/2015/1210/231107_2xs0_90415.png)
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次.
相关文章推荐
- ios openURL:方法
- 线段树
- leetcode笔记:Word Search II
- UVALive 6925 Volume of Revolution(数学题)
- BAYKEE中开发中遇到的问题及解决方案
- 眼的保健
- java正则表达式
- 通过反射给bean赋值
- jxl 依据xml映射配置 导入导出excel (1)
- jxl 依据xml映射配置 导入导出excel(2)
- NSWebView NSURLSession 简化NSURLSession
- CSS DOM动态样式
- EventDOM:事件DOM
- form对象
- 特殊字符的处理
- 几大基础算法
- js图片处理
- js封装教程
- 技术实现总结
- python使用SQL语句操作数据库中文乱码的解决