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