題目
給定一個字符串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);
}
}
};