【Lintcode】1032. Letter Case Permutation

題目地址:

https://www.lintcode.com/problem/letter-case-permutation/description

給定一個字符串,允許將其中的英文字母變換大小寫。要求返回變換產生的所有可能性。

本質上是遍歷二叉樹,可以採用DFS。用一個StringBuilder保存已經產生的字符串片段,然後枚舉每個英文字母是大寫還是小寫。注意回溯的時候要恢復現場。代碼如下:

import java.util.ArrayList;
import java.util.List;

public class Solution {
    /**
     * @param S: a string
     * @return: return a list of strings
     */
    public List<String> letterCasePermutation(String S) {
        // write your code here
        List<String> res = new ArrayList<>();
        
        dfs(S, 0, new StringBuilder(), res);
        return res;
    }
   	
    // 從s[pos]開始枚舉s[pos]是非英文字母,還是大寫,還是小寫
    private void dfs(String s, int pos, StringBuilder sb, List<String> res) {
        if (pos == s.length()) {
            res.add(sb.toString());
            return;
        }
        
        // 如果s[pos]非英文字母,則直接append到sb後面,進入下一個位置進行枚舉;
        // 如果是英文字母,則枚舉append其小寫以及大寫,分別進入下一層遞歸枚舉;
        // 每次遞歸結束就返回了遞歸樹的上一層節點,需要把sb也恢復原狀
        if (!Character.isLetter(s.charAt(pos))) {
            sb.append(s.charAt(pos));
            dfs(s, pos + 1, sb, res);
            sb.setLength(sb.length() - 1);
        } else {
            sb.append(Character.toLowerCase(s.charAt(pos)));
            dfs(s, pos + 1, sb, res);
            sb.setLength(sb.length() - 1);
            
            sb.append(Character.toUpperCase(s.charAt(pos)));
            dfs(s, pos + 1, sb, res);
            sb.setLength(sb.length() - 1);
        }
    }
}

時間複雜度O(n2n)O(n2^n),空間O(n)O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章