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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。