毎日のアルゴリズム: 回文部分文字列

毎日のアルゴリズム: 回文部分文字列

[[434467]]

文字列が与えられた場合、その文字列に含まれる回文の部分文字列の数を数えることがタスクです。

開始位置または終了位置が異なる部分文字列は、同じ文字で構成されていても、異なる部分文字列と見なされます。

例1:

  1. 入力: "abc"  
  2.  
  3. 出力: 3
  4.  
  5. 説明: 3 つの回文部分文字列: "a" "b" "c"  

例2:

  1. 入力: 「aaa」  
  2.  
  3. 出力: 6
  4.  
  5. 説明: 6 つの回文部分文字列: "a" "a" "a" "aa" "aa" "aaa"  

ヒント:

  • 入力文字列の長さは 1000 を超えません。

解決策1: ブルートフォース

  1. countSubstrings =関数(s) {
  2. カウントを 0 にする
  3. ( i = 0 とします; i < s.length; i++) {
  4. (j = i; j < s.length; j++)の場合{
  5. if (isPalindrome( s.substring (i, j + 1))) {
  6. カウント++
  7. }
  8. }
  9. }
  10. 戻る カウント 
  11. }
  12.  
  13. let isPalindrome =関数(s) {
  14. i = 0、j = s.length - 1 とします。
  15. i < j である間 {
  16. s[i] != s[j] の場合、戻り値 間違い 
  17. 私は++
  18. じ --  
  19. }
  20. 戻る 真実 
  21. }

複雑性分析:

  • 時間計算量: O(n3)
  • 空間計算量: O(1)

解決策2: 動的プログラミング

文字列の最初と最後の文字が同じで、残りの部分文字列も回文である場合、その文字列は回文です。その中で、残りの部分文字列が回文であるかどうかはより小さなサブ問題であり、その結果はより大きな問題の結果に影響を与えます。

サブ問題をどのように記述するのでしょうか?

明らかに、部分文字列は両端の i ポインタと j ポインタによって決定されます。これらは部分問題を記述する変数です。部分文字列 s[i...j] (dp[i][j]) が回文であるかどうかが部分問題です。

計算されたサブ問題の結果は、基本ケースから始めて 2 次元配列に記録し、表に記入するように各サブ問題の解を導出します。

  1. ああ、ああ、ああ
  2. 私は✅
  3. b ✅

注: i<=j、テーブルの半分だけ使用すればよく、垂直にスキャンする

それで:

  1. i === j: dp[i][j] = 
  2. j - i == 1 && s[i] == s[j]: dp[i][j] = 
  3. j - i > 1 && s[i] == s[j] && dp[i + 1][j - 1]: dp[i][j] = 

今すぐ:

  1. s[i] == s[j] && (j - i <= 1 || dp[i + 1][j - 1]): dp[i][j] = 

そうでなければ偽

コード実装:

  1. countSubstrings =関数(s) {
  2. 定数len = s.length
  3. カウントを 0 にする
  4. const dp = 新しい配列(len)
  5.  
  6. (i = 0; i < len; i++)の場合{
  7. dp[i] = 新しい配列(len).fill( false )
  8. }
  9. (j = 0; j < len; j++)の場合{
  10. ( i = 0; i <= j; i++ とします) {
  11. s[i] == s[j] && (j - i <= 1 || dp[i + 1][j - 1]) の場合 {
  12. dp[i][j] = 
  13. カウント++
  14. }それ以外{
  15. dp[i][j] = 
  16. }
  17. }
  18. }
  19. 戻る カウント 
  20. }

コード実装(最適化):

上記の表の縦の列を 1 次元配列として考えるか、縦にスキャンします。この場合、dp を 1 次元配列として定義するだけで済みます。

  1. countSubstrings =関数(s) {
  2. 定数len = s.length
  3. カウントを 0 にする
  4. const dp = 新しい配列(len)
  5.  
  6. (j = 0; j < len; j++)の場合{
  7. ( i = 0; i <= j; i++ とします) {
  8. s[i] === s[j] && (j - i <= 1 || dp[i + 1]) の場合 {
  9. dp[i] = 
  10. カウント++
  11. }それ以外{
  12. dp[i] = 
  13. }
  14. }
  15. }
  16. 戻る カウント;
  17. }

複雑性分析:

  • 時間計算量: O(n2)
  • 空間計算量: O(n)

リートコード: https://leetcode-cn.com/problems/palindromic-substrings/solution/leetcode647hui-wen-zi-chuan-by-user7746o/

<<:  ディープラーニングアーキテクチャにおける予測コーディングモデルに関しては、PredNetに目を向ける必要があります。

>>:  Leetcode の基本アルゴリズム: スライディング ウィンドウについてお話しましょう

ブログ    
ブログ    

推薦する

eBayは機械学習を利用してプロモーションリストを改善

​翻訳者 | ブガッティ校正:孫淑娟オンラインマーケットプレイスの eBay では、「ウォッチリスト...

...

世界モデルが大きな貢献を果たしました! 20以上の自動運転シナリオの偽データがリアルすぎる…

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

人工知能は今年のトップ10の新興職業の中で第1位にランクイン

どの企業もある程度はテクノロジーを取り入れる必要があったため、こうした急成長の仕事にもその傾向が反映...

LLaMAが使用するオープンソースデータセットは棚から削除されました。これには約20万冊の本が含まれており、OpenAIデータセットに匹敵します。

オープンソースのデータセットは著作権侵害のため棚から削除されました。例えば、LLaMA、GPT-J ...

速報です!画像AI企業「Huiyi Huiying」がハッキングされ、COVID-19研究成果が公開された

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

大スキャンダル?国内のAI専門家数十人が参加した論文が重大な盗作の疑いで告発される

清華大学、北京大学、上海交通大学、テンセント、ファーウェイ、JD.com、バイトダンス、そして今最も...

2027年のAIはどのようになっているでしょうか?ヒントは、あなたの脳の中にあります。

やっていることをやめて、窓の外の鳥やリス、昆虫などを眺めてみましょう。これらの生物は、食物を見つけた...

「量子超越性」の後、GoogleはTensorFlowの量子バージョンを強力にオープンソース化

Googleは2019年10月に「量子超越性」の検証に関する論文をNatureに掲載した後、3月9日...

「天宮2.0」MoE大型モデル発売

2月6日、崑崙万為はMoE大規模言語モデルの新バージョン「天宮2.0」と「天宮AIスマートアシスタン...

卒業後すぐに年収56万は貰えるんですか?右! Twitterの機械学習の専門家が書いた上級マニュアルをご覧ください

[[210651]]年収10万?プログラマーにとっては、これで十分です。国家統計局が今年上半期に発表...

1800億パラメータ、世界最高峰のオープンソース大型モデルFalconが正式発表! Crush LLaMA 2、GPT-4に近いパフォーマンス

一夜にして、世界で最も強力なオープンソースの大型モデル Falcon 180B がインターネット全体...

AI および機械学習プロジェクトはどの程度安全ですか?

人工知能と機械学習は私たちに利益をもたらしますが、そのセキュリティには注意が必要です。どれくらい安全...

職場におけるAIとARの進化

[[434145]]職場における支援/拡張現実 (AR) と人工知能 (AI) の可能性を最大限に引...