&LeetCode784& 字母大小写全排列

题目

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

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

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

输入: S = “12345”
输出: [“12345”]

注意:

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

来源:力扣(LeetCode

思路

考虑一种递归的写法,是一种回溯的思路;
举例说S = “abc”;
首先,用一个pos指向当前处理的位置,初始化为0,然后在递归函数中,如果pos等于s的长度,则将s存入结果res返回,否则调用递归函数,此时带入pos+1,那么递归函数就会一直深入,直到pos等于s的长度,那么此时就把"abc"存入结果res了,返回后此时pos=2,发现s[pos]是字母,则用flip方法来翻转字母,并且调用递归函数,这样"abC"就会存入结果res中;
然后,回溯到pos=1的位置,s[pos]是字符,可以flip,并且调用递归函数,这样"aBC"就会存入结果res中;
其次,pos继续往后遍历,这样"aBc"就会存入结果res中,然后回溯到pos=0的位置,s[pos]是字符,可以flip,并且调用递归函数,这样"ABc"就会存入结果res中,然后继续回溯,这样"ABC"就会存入结果res中,pos又回溯到1的位置,s[pos]是字符,可以flip,并且调用递归函数,这样"AbC"就会存入结果res中,然后pos继续往后遍历,这样"Abc"就会存入结果res中。
注意:知道小写字母和大写字母之间的差值为 32。

C++代码

class Solution {
public:
    vector<string> letterCasePermutation(string S) 
    {
        vector<string> res;
        helper(S, 0, res);
        return res;
    }

    void helper(string& s, int pos, vector<string>& res)
    {
        if (pos == s.size())
        {
            res.push_back(s);
            return;
        }
        helper(s, pos + 1, res);
        if (s[pos] > '9')
        {
            s[pos] ^= 32;
            helper(s, pos + 1, res);
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章