LeetCodeの問題解決--784:総額完全な配列

関連するトピック

トピックリンク

LeetCode中国、https://leetcode-cn.com/problems/letter-case-permutation/ログインする注意が必要。

私のOJ、http://47.110.135.197/problem.php?id=5257

タイトル説明

それぞれの文字の場合、文字列シフトによる文字列S、Sを考えると、我々は新しい文字列を取得することができます。得られたすべての可能な文字列のセットを返します。

入力形式

一つだけの行、列S.
すべての入力が数字と文字のみことを確認してください。

出力フォーマット

バリエーションS.を表す文字列のいくつかのライン

サンプル入力

a1b2

サンプル出力

["a1b2","a1B2","A1b2","A1B2"]

トピック分析

問題の意味の分析

すべての出力の変化の規則に従って、文字列sを考えます。1文字が同じまま、; 2は、大文字と小文字を変更する:2つのルールがあります。標準テンプレートDFSのタイトル、エントリーレベルの難易度。

サンプルデータ解析

0番目の文字から文字列s、開始を取得した後一つずつ検索します。それはルールに従って、我々は変化をプロットすることができ、文字の位置を以下に示すことができるようにと仮定すると:

オプション1は、左に移動し、文字は変更されず、次の文字を検索するために続けています。私たちは、数字やアルファベットの操作が同じであるかどうか、それは同じまま見ることができます。

オプション2は、右に行くには、その手紙ならば、それは次の文字を探し続け、その後、変化に敏感です。

DFS全体のプロセスは、我々は計画を開始し、その後、オプションIIを使用しています。ここでは、DFSのトラバースは、図に示す変更プロセスを引き出すことができるかをシミュレートするために描かれたサンプル入力A1B2、赤の出力を使用しています。

アルゴリズムの考え方

1は、文字列s読み込みます。

図2に示すように、ゼロ文字から始まる、ルールに従って(プログラムを使用し、その後、オプションIIを使用する)に変更。

検索終了条件

終了条件は、文字列の長さで検索しなければなりません。

検索機能のパラメータ

パラメータDFS()関数が必要となるものを分析してみましょう。結果は文字列であるので、DFS()関数ので、

1は、現在の文字を表す文字列を渡す必要がどのようにのようなものです。

2だけでなく、複数の文字列の最初であるローカルストリング、現在列挙を表す位置。

私たちはこの質問のDFSを決定することができるように、以下のように()関数のプロトタイプは次のようになります。

//参数s:表示当前字符串的内容
//参数index:表示现在枚举到字符串s的第几位
void dfs(string &s, int index) {
    if (index==s.length()) {
        return;
    }
    dfs(s, index+1);//保持不变直接搜索下一位
    if (s[index]>='A') {
        //是字母
        s[index] ^= 32;//大小写切换
        dfs(s, index+1);//搜索下一位
    }
}

スタート呼び出し方法

dfs(s, 0);//表示从第0位开始搜索字符串s

バックトラッキング

この問題は、それを直接検索し、バックトラックを必要としません。

AC参照コード

class Solution {
public:
    vector<string> ans;

    vector<string> letterCasePermutation(string S) {
        dfs(S, 0);
        return ans;
    }

    void dfs(string &s, int idx) {
        if (s.length()==idx) {
            ans.push_back(s);
            return;
        }

        //本位不变,搜索下一位
        dfs(s, idx+1);

        //本位变,搜索下一位
        if (s[idx]>='A') {
            s[idx] ^= 32;
            dfs(s, idx+1);
        }
    }
};

コードガイド

 大文字と小文字の変更

小文字の変化は、直接判決文を判断し使用することができます。ここで私は少しトリック、現在の手紙XOR 32を使用していました。ビット操作を使用します。あなたがそれを行うことができる理由のは、分析してみましょう。キャラクタ「A」はバイナリ0B01に対応するASCII 65であり、0、00001文字「」バイナリ0B01に対応するASCII 97であり、一方1 00001、「A」と「」は2つで構成されている比較します値は、我々が0b00100000は、32進に対応すること、(赤)の違いを見つけることができます。「B」及び「b」は真なので、他のです。

DFSコードルーチン

DFSコードルーチンは、私の他の記事を参照してくださいすることができますhttps://blog.csdn.net/justidle/article/details/104925699

公開された239元の記事 ウォンの賞賛291 ビュー107万+

おすすめ

転載: blog.csdn.net/justidle/article/details/104930114