C++の連結語
単語のリストがあるとします。これらの言葉は明確です。与えられた単語のリストからすべての連結された単語を見つけるアルゴリズムを考案する必要があります。連結された単語は、実際には、指定された配列内の少なくとも2つの短い単語で完全に構成される文字列です。
したがって、単語が["cow"、 "cows"、 "cowsgoatcows"、 "goat"、 "goatcowsgoat"、 "hippopotamuses"、 "deer"、 "deercowgoatcow"]の場合、出力は["cowsgoatcows"、 "goatcowsgoat"、 "deercowgoatcow"]
これを解決するには、次の手順に従います-
- 関数isPresent()を定義します。これには、str、head、idx、配列dpが必要です。
- idx> =strのサイズの場合、-
- trueを返す
- dp [idx]が-1に等しくない場合、-
- return dp [idx]
- ノードcurrを作成します:=head
- ok:=false
- iを初期化する場合:=idx、i
- x:=str [i]
- currの子[x]でない場合は、-
- ループから抜け出す
- それ以外の場合
- curr:=currの子[x]
- isEnd of currがtrueの場合、-
- ok:=ok OR isPresent(str、head、i + 1、dp)
- currの子[x]:=新しいノードを作成
- curr:=words [i]
- currが""と同じ場合、-
- 次の部分を無視し、次の反復にスキップします
- 同じサイズのcurrの配列dpを定義し、これに-1を入力します
- 関数isPresent(curr、head、0、dp)を呼び出すとゼロ以外の場合、-
- retの最後にcurrを挿入します
- それ以外の場合
- 関数insertNode(head、curr)を呼び出します
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } struct Node{ bool isEnd; map <char, Node*> child; Node(){ isEnd = false; } }; class Solution { public: bool isPresent(string str, Node* head, int idx, vector <int>& dp){ if(idx >= str.size())return true; if(dp[idx] != -1)return dp[idx]; Node* curr = head; bool ok = false; for(int i = idx; i < str.size(); i++){ char x = str[i]; if(!curr->child[x]){ break; }else{ curr = curr->child[x]; } if(curr->isEnd){ ok |= isPresent(str, head, i + 1, dp); } } return dp[idx] = ok; } static bool cmp(string s1, string s2){ return s1.size() < s2.size(); } void insertNode(Node* head, string s){ Node* curr = head; for(int i = 0; i < s.size(); i++){ char x = s[i]; if(!curr->child[x]){ curr->child[x] = new Node(); } curr = curr->child[x]; } curr->isEnd = true; } vector<string> findAllConcatenatedWordsInADict(vector<string>& words) { Node* head = new Node(); sort(words.begin(), words.end(), cmp); vector <string> ret; for(int i = 0; i < words.size(); i++){ string curr = words[i]; if(curr=="")continue; vector <int> dp(curr.size(), -1); if(isPresent(curr, head, 0, dp)){ ret.push_back(curr); }else{ insertNode(head, curr); } } return ret; } }; main(){ Solution ob; vector<string> v = {"cow","cows","cowsgoatcows","goat","goatcowsgoat","hippopotamuses","deer","deercowgoatcow"}; print_vector(ob.findAllConcatenatedWordsInADict(v)); }
入力
{"cow","cows","cowsgoatcows","goat","goatcowsgoat","hippopotamuses","deer","deercowgoatcow"}
出力
[cowsgoatcows, goatcowsgoat, deercowgoatcow, ]
-
C++の文で回文の単語を数える
英語の文章を含む文字列が与えられます。目標は、回文である文字列内の単語の数を見つけることです。回文の単語は、最初または最後から読み取ったときに同じアルファベット順を持つ単語です。文が「マダムは良いマラヤーラム語を話す」の場合、回文の単語の数は2です。(マダムとマラヤーラム語) 注 −単語には、大文字と小文字の両方のアルファベットを含めることができます。 例を挙げて理解しましょう。 入力 − str=お母さんとアンナは正午に出発しました; 出力 −文中の回文語の数は− 3 説明 −上記の文の回文の単語は−ママ、アンナ、正午です。 (アルファベットの場合に関係なく) 入力 −str=
-
C++で最大のBSTサブツリー
二分木があるとしましょう。その中で最大のサブツリーを見つける必要があります。ここで、最大とは、ノードの数が最も多いサブツリーを意味します。 したがって、入力が次のような場合、 この場合、最大のBSTサブツリーが強調表示されているため、出力は3になります。 これを解決するには、次の手順に従います- データと呼ばれる1つの構造を定義します。サイズ、maxVal、minVal、okの4つの値があり、okはtrue/falseの値のみを保持できます 解決(TreeNode *ノード) ノードがnullの場合、&miuns; 初期化してデータを返す(0、無限大、-無