【動的計画法を学ぶ】単語分割(24)

目次

動的プログラミングを学ぶにはどうすればよいですか?

1. トピック分析

2. アルゴリズム原理

1. ステータス表現

2. 状態遷移方程式

3. 初期化

4.注文の実行

5. 戻り値

3. コードの書き方

最後に次のように書きます。


動的プログラミングを学ぶにはどうすればよいですか?

動的プログラミングの学習はもちろん、アルゴリズムの学習にも近道はありません。

動的プログラミング アルゴリズムに関する質問を私と一緒に解決し、動的プログラミングを一緒に学びましょう!

1. トピック分析

トピックリンク: 139. 単語の分割 - LeetCode 

このテーマは簡単に理解できます。辞書を引いてください。

辞書内の文字列を、彼が指定したターゲット文字列に接続できるかどうかを確認してください。

2. アルゴリズム原理

1. ステータス表現

dp[ i ] は、開始点から dp[ i ] までの文字列を辞書内の文字列で連結できるかどうかを示します。

実績が true の場合、そうでない場合は false

2. 状態遷移方程式

最後の局面の状況に応じて問題を分割し、

分析のためにそれを 2 つの区間に分割できます。

左側のセクションはうまく接続できますか? 正しい間隔は辞書にある文字列ですか?

したがって、状態遷移方程式は次のようになります。

左の間隔 == true && 右の間隔は辞書に存在します。それ以外の場合は false

3. 初期化

境界を越えないようにするために、仮想ヘッド ノードを追加します。

4.注文の実行

左から右へ。

5. 戻り値

dp テーブルの最後の位置を返します。

3. コードの書き方

class Solution {
public:
    bool wordBreak(string s, vector<string>& wordDict) {
        unordered_set<string> st;
        for(auto e : wordDict) st.insert(e);

        vector<bool> dp(s.size() + 1);
        dp[0] = true;
        for(int i = 0; i <= s.size(); i++) {
            for(int j = 0; j < i; j++) {
                if(dp[j] && st.find(s.substr(j, i - j)) != st.end()) {
                    dp[i] = true;
                    break;
                }
            }
        }
        return dp[s.size()];
    }
};

最後に次のように書きます。

以上が今回の記事の内容となります、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/131956162