目次
動的プログラミングを学ぶにはどうすればよいですか?
動的プログラミングの学習はもちろん、アルゴリズムの学習にも近道はありません。
動的プログラミング アルゴリズムに関する質問を私と一緒に解決し、動的プログラミングを一緒に学びましょう!
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()];
}
};
最後に次のように書きます。
以上が今回の記事の内容となります、読んでいただきありがとうございます。
何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。
記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜