LeetCode-784. Letter Case Permutation

Description

Given a string S, we can transform every letter individually to be 
lowercase or uppercase to create another string.  Return a list of 
all possible strings we could create.

Example

Input: S = "a1b2"
Output: ["a1b2", "a1B2", "A1b2", "A1B2"]

Input: S = "3z4"
Output: ["3z4", "3Z4"]

Input: S = "12345"
Output: ["12345"]

Note

S will be a string with length at most 12.
S will consist only of letters or digits.

Solution 1(C++)

class Solution {
public:
    vector<string> letterCasePermutation(string S) {
        vector<string> res;
        if(S.size()==0){res.push_back(S);}
        else if(S.size()==1){
            if(isdigit(S[0])){res.push_back(S);}
            else{
                S[0]=toupper(S[0]); res.push_back(S);
                S[0]=tolower(S[0]); res.push_back(S);
            }
        }
        else{
            vector<string> temp;
            if(isdigit(S[0])){string str=""; str.push_back(S[0]); temp.push_back(str);}
            else{
                string ups="", los="";
                ups.push_back(toupper(S[0])); temp.push_back(ups);
                los.push_back(tolower(S[0])); temp.push_back(los);
            }
            string subs = S.substr(1);
            vector<string> back=letterCasePermutation(subs);
            for(string s: temp){
                for(string sb: back){
                    string sa=s;
                    sa.append(sb);
                    res.push_back(sa);
                }
            }
        }
        return res;
    }
};

Solution 2(C++)

class Solution {
public:
    void permute (string S, vector<string>& result, int index)
    {
        result.push_back(S);
        if(index >= S.size())
            return;      
        for (int i = index ; i < S.size(); i++)
        {
            if (isalpha(S[i]))
            {
                S[i] ^= 32;
                permute (S, result, i+1);
                S[i] ^= 32;
            }
        }
    }

    vector<string> letterCasePermutation(string S) 
    {
        vector<string> result;
        permute(S, result, 0);
        return result;
    }
};

算法分析

解法一利用的是迭代的方法解决的,类似的题目还有:
LeetCode-21. Merge Two Sorted Lists
LeetCode-326. Power of Three
LeetCode-263. Ugly Number

解法一还要注意的一点就是,

for(string s: temp){
    for(string sb: back){
        string sa=s;
        sa.append(sb);
        res.push_back(sa);
    }
}

这一句中,很必要的中间一步,string sa=s; sa.append(sb)。而不能直接s.append(sb)。原因自然就是如果按照后者来做,那么在多次循环之后,s并没有更新。那么,一个s就会添加多个sb。就得不到正确答案了。

解法二是主流解法,利用回溯的思想。其实稍微改一改,就可以写成dfs或者bfs。

目前总结一下自己想法中的回溯思路,首先标记,然后迭代,迭代完成后取消标记。这里标记就是 ^ = 32, 取消标记就是 ^ = 32。中间就是迭代。

程序分析

更新一个小技巧,将字母字符转换成对应大小写。

if (isalpha(S[i])){
    S[i] ^= 32;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值