C++で重複する文字を削除する
これを解決するには、次の手順に従います-
-
ans:=1つの空の文字列
-
1つのスタックstを定義する
-
サイズ26のアレイonStackを定義する
-
1つのマップを定義するm
-
n:=sのサイズ
-
iを初期化する場合:=0、i
-
m[s[i]]を1増やします
-
-
iを初期化する場合:=0、i
-
サイズiの配列x=sを定義します
-
m[x]を1だけ減らす
-
onStack [x-'a']がゼロ以外の場合、
-
次の反復にスキップし、次の部分を無視します
-
-
stが空ではなく、x
を実行します。 -
onStack [top of st-'a']:=false
-
stからアイテムを削除
-
-
xをstに挿入
-
onStack [x-'a']:=true
-
-
(stが空)がfalseの場合、-
を実行します。-
x:=stの最上位要素
-
stからアイテムを削除
-
ans =ans + x
-
-
配列を逆にするrev
-
ansを返す
例
理解を深めるために、次の実装を見てみましょう-
#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; } class Solution { public: string removeDuplicateLetters(string s) { string ans = ""; stack <char> st; vector <int> onStack(26); map <char, int> m; int n = s.size(); for(int i = 0; i < n; i++){ m[s[i]]++; } for(int i = 0; i < n; i++){ char x = s[i]; m[x]--; if(onStack[x - 'a'])continue; while(!st.empty() && x < st.top() && m[st.top()]){ onStack[st.top() - 'a'] = false; st.pop(); } st.push(x); onStack[x - 'a'] = true; } while(!st.empty()){ char x = st.top(); st.pop(); ans += x; } reverse(ans.begin(), ans.end()); return ans; } }; main(){ Solution ob; cout << (ob.removeDuplicateLetters("abccb")); }
入力
“abccb”
出力
“abc”
-
C++で重複するサブツリーを検索する
二分木があるとします。重複するすべてのサブツリーを見つける必要があります。したがって、重複するサブツリーの種類ごとに、それらのいずれかのルートノードを返す必要があります。したがって、-のようなツリーがあるとします。 重複するサブツリーは-です これを解決するには、次の手順に従います- 配列retを作成し、マップを作成しますm 再帰メソッドsolve()を定義します。これはノードを入力として受け取ります。これは次のように機能します- ノードがnullの場合、-1を返します x:=ノードの値を文字列として、「#」を連結します。 左:=ソルブ(ノードの左)、右:=ソルブ(ノード
-
C++で重複するすべてのサブツリーを検索する
二分木があると考えてください。ツリーに重複するサブツリーがあるかどうかを確認する必要があります。以下のような二分木があるとします- サイズ2の2つの同一のサブツリーがあります。各サブツリーD、BD、およびBEには、両方とも重複するサブツリーがあります。ツリーのシリアル化とハッシュプロセスを使用して、この問題を解決できます。サブツリーの順序どおりの走査をハッシュテーブルに格納します。空のノードには開き括弧と閉じ括弧を挿入します。 例 #include <iostream> #include <unordered_set> #include <unordere