#leetCode刷题纪实 Day29

https://leetcode-cn.com/problems/letter-case-permutation/

给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。

示例:
输入: S = "a1b2"
输出: ["a1b2", "a1B2", "A1b2", "A1B2"]

输入: S = "3z4"
输出: ["3z4", "3Z4"]

输入: S = "12345"
输出: ["12345"]
注意:

S 的长度不超过12。
S 仅由数字和字母组成。

小菜鸡的尝试:

第一感觉是回溯。就开始着手写了,可是想不出递归的结束条件emmm

膜拜大佬代码:

【递归回溯法】

用vector<string> res存储结果,s为待处理字符串

递归结束条件:
当S为空串,递归结束,写入结果
递归中分三种情况:

遇到的是数字,letter上添上这个数字继续递归
遇到的是小写字母,letter上添加这个小写字母继续递归 + letter上添加这个大写字母继续递归
遇到的是大写字母,letter上添加这个大写字母继续递归 + letter上添加这个小写字母继续递归

 1 class Solution {
 2 public:
 3     vector<string> res;
 4     vector<string> letterCasePermutation(string S) {
 5         letterCase("", S);
 6         return res;
 7     }
 8     void letterCase(string letter, string S) {
 9         if (S.size()==0) {
10             res.push_back(letter);
11             return;
12         }
13         char s = S[0];
14         letterCase(letter+s, S.substr(1));
15         if (s >= 'a' && s <='z') {
16             letterCase(letter + char(toupper(s)), S.substr(1));
17         } else if (s >= 'A' && s <='Z') {
18             letterCase(letter + char(tolower(s)), S.substr(1));
19         }
20     }
21 };

【牛牛的O(n)】

 1 class Solution {
 2 public:
 3     vector<string> letterCasePermutation(string S) {
 4         int size = S.size();
 5         vector<string> v;
 6         // 初始化
 7         int num = 1;
 8         v.push_back("");
 9         for (int i = 0; i < size; i++) { // 逐个判断字符串中每个字符
10             if (isalpha(S[i])) { // 是字符
11                 for (int j = 0; j < num; j++) {
12                     string temp1 = v[j];
13                     string temp2 = temp1;
14                     temp1 += S[i];
15                     v[j] = temp1;
16                     S[i] ^= 32; // 巧妙运用异或运算,完成大小写转换
17                     temp2 += S[i];
18                     v.push_back(temp2);
19                 }
20                 num = num * 2;
21             } else { // 是数字 
22                 for (int j = 0; j < num; j ++) {
23                     string temp = v[j];
24                     temp += S[i];
25                     v[j] = temp;
26                 }
27             }
28         }
29         return v;
30     }
31 };

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-case-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

猜你喜欢

转载自www.cnblogs.com/xyy999/p/11954936.html
今日推荐