&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);
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章