【Leetcode】784. Letter Case Permutation

題目地址:

https://leetcode.com/problems/letter-case-permutation/

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

思路是DFS。遇到字母時,枚舉其爲小寫和大寫兩種情況,得到所有可能性等價於在一棵二叉樹上進行遍歷,只需要記得回溯的時候要恢復現場即可。想象ss是樹根,變更其第一個英文字母后進入遞歸下一層,嘗試變更之後的英文字母,遍歷的時候把沿途經過的所有字符串加入最終結果;在遞歸結束的時候回溯到上一層節點,此時要把當初變更的字母再變回來,保持搜索樹沒有發生變化。代碼如下:

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

public class Solution {
    public List<String> letterCasePermutation(String S) {
        List<String> res = new ArrayList<>();
        dfs(S.toCharArray(), 0, res);
        return res;
    }
    
    // 從s[pos]開始枚舉每個字母的大小寫兩個情況
    private void dfs(char[] s, int pos, List<String> res) {
    	// 這裏採用先序遍歷,一進入樹的節點就加入res
        res.add(new String(s));
        
        for (int i = pos; i < s.length; i++) {
            if (!Character.isLetter(s[i])) {
                continue;
            }
            
            char ch = s[i];
            // 如果當前字母是大寫,則將其變爲小寫,再進入下一層遞歸;如果當前字母是小寫,也類似操作
            if (Character.isUpperCase(ch)) {
                s[i] = Character.toLowerCase(ch);
                dfs(s, i + 1, res);
                s[i] = ch;
            } else {
                s[i] = Character.toUpperCase(ch);
                dfs(s, i + 1, res);
                s[i] = ch;
            }
        }   
    }
}

時間複雜度O(n2n)O(n2^n),空間O(n)O(n)(遞歸棧深度取決於字符串中的英文字母數量,另外char數組也要佔用空間)。

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