C++の文字列に太字のタグを追加する
文字列sとdictという文字列のリストがあるとすると、太字のタグとの閉じたペアを追加して、そのdictに存在するsの部分文字列をラップする必要があります。このような2つの部分文字列が重なる場合は、閉じた太字のタグの1つのペアだけでそれらをまとめる必要があります。また、太字のタグで囲まれた2つの部分文字列が連続している場合は、それらを組み合わせる必要があります。
したがって、入力がs ="abcxyz123" dict is ["abc"、 "123"]の場合、出力は " abc xyz 123 "
これを解決するには、次の手順に従います-
-
n:=sのサイズ
-
サイズnの太字の配列を定義する
-
ret:=空白の文字列
-
初期化i:=0、終了:=0の場合、i
-
初期化j:=0の場合、j
-
インデックスからのsの部分文字列(iからdict [j]-1のサイズ)がdict [j]と同じである場合、-
-
end:=endの最大値とi+ dict [j]
のサイズ
-
-
-
bold [i]:=end> i
-
-
初期化i:=0の場合、i
を実行します。-
bold [i]がゼロの場合、-
-
ret:=ret + s [i]
-
j:=i + 1
-
次の部分を無視し、次の反復にスキップします
-
-
j:=i
-
(j
-
(jを1増やします)
-
-
ret:=インデックスiからjへのretのサブストリング--i-1 concatenate "" concatenate s
-
-
retを返す
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string addBoldTag(string s, vector<string>& dict) {
int n = s.size();
vector<int> bold(n);
string ret = "";
for (int i = 0, end = 0; i < s.size(); i++) {
for (int j = 0; j < dict.size(); j++) {
if (s.substr(i, dict[j].size()) == dict[j]) {
end = max(end, i + (int)dict[j].size());
}
}
bold[i] = end > i;
}
int j;
for (int i = 0; i < s.size(); i = j) {
if (!bold[i]) {
ret += s[i];
j = i + 1;
continue;
}
j = i;
while (j < s.size() && bold[j])
j++;
ret += "<b>" + s.substr(i, j - i) + "</b>";
}
return ret;
}
};
main(){
Solution ob;
vector<string> v = {"abc","123"};
cout << (ob.addBoldTag("abcxyz123", v));
} 入力
"abcxyz123", ["abc","123"]
出力
<b>abc</b>xyz<b>123</b>
-
C++の最小文字列
同じ長さの2つの文字列sとtがあり、両方とも小文字であるとします。最初にsを任意の順序に再配置してから、sをtに変換するために必要な変更の最小数を数えることを検討してください。 したがって、入力がs =eccynue、t =scienceの場合、出力は「eccynue」を「yccence」に再配置したかのように2になり、yをsに置き換えます。 2番目のcはiで、「科学」になります。 これを解決するには、次の手順に従います- ret:=0 sの頻度を保持する2つの配列cnt1とtの頻度を保持するcnt2を定義します 初期化i:=0の場合、i <26の場合、更新(iを1増やしま
-
C++で2つのバイナリ文字列を追加するプログラム
2進数の文字列が2つある場合、それら2つの2進数文字列を加算して得られた結果を見つけ、その結果を2進数文字列として返す必要があります。 2進数は、0または1のいずれかで表される数値です。2つの2進数を加算する際には、2進数の加算規則があります。 0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0, carry 1 入力 str1 = {“11”}, str2 = {“1”} 出力 “100” 入力 str1 = {“110”},