原题链接
原题大意:给定字符串s,字符串中每个字母的大小写不同可组成新的字符串,求出可能组成的全部字符串。下面是给出的例子:
Examples:
Input: S = "a1b2"
Output: ["a1b2", "a1B2", "A1b2", "A1B2"]
Input: S = "3z4"
Output: ["3z4", "3Z4"]
Input: S = "12345"
Output: ["12345"]
分析:每个字母可大写可小写,用0,1代表该字母的大小写的状态,1为大写。若字符串为a1b2,包含两个字母,则两个字母所有的状态组合为{00,01,10,11},将枚举状态看作二进制数,则化为十进制为{0,1,2,3},这样问题就能很好地被解决了。
#include<iostream>
#include<vector>
#include<string>
#include<bitset>
#include<math.h>
using namespace std;
vector<string> letterCasePermutation(string& s)
{
vector<string> ans;
vector<int> letterPos;
int mark = 1,size = s.size();
if(size == 0 ) return ans;
for(int i = 0; i < size; i++)
{
if(isalpha(s[i]))
{
s[i] = tolower(s[i]);
mark *= 2;
letterPos.push_back(i);
}
}
for(int i = 0; i < mark; i++)
{
int t = i;
string ts = s;
for(int j = 0;j < letterPos.size(); j++)
{
//cout << t << " " << j << " " << (t >> j) % 2 << endl;
if((t >> j) % 2 == 1)
{
ts[letterPos[letterPos.size() - 1 - j]] = toupper(s[letterPos[letterPos.size() - 1 - j]]);
}
//ts[letterPos[j]] = (t >> j) % 2 == 1 ? toupper(s[letterPos[j]]) : s[letterPos[j]];
}
cout << ts << endl;
ans.push_back(ts);
}
return ans;
}
int main()
{
string s;
s = "a1b2";
vector<string> ans = letterCasePermutation(s);
//for(int i = 0;i < ans.size(); i++) cout << ans[i] << endl;
}
网友评论