美文网首页
LeetCode 784. Letter Case Permut

LeetCode 784. Letter Case Permut

作者: 敢想敢做_ | 来源:发表于2018-09-08 14:12 被阅读0次

原题链接
原题大意:给定字符串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;
}

相关文章

网友评论

      本文标题:LeetCode 784. Letter Case Permut

      本文链接:https://www.haomeiwen.com/subject/oigkgftx.html