C++でAAAまたはBBBのない文字列
2つの整数AとBがあるとすると、-
のような任意の文字列Sを返す必要があります。-
Sの長さはA+Bで、正確にA個の文字「a」とB個の「b」文字が含まれています。
-
サブストリング「aaa」と「bbb」はストリングSには含まれません
したがって、指定された整数がA =4、B =1の場合、結果は「aabaa」になります。
これを解決するには、次の手順に従います-
-
文字列retを定義します。最初は空です
-
一方|A– B |> =2、
-
A> Bの場合、
-
ret:=ret連結「aa」
-
Aを2減らします
-
Bがゼロ以外の場合、「b」をretと連結し、Bを1つ減らします
-
-
その他
-
ret:=ret連結「bb」
-
Bを2減らす
-
Aがゼロ以外の場合、「a」をretと連結し、Aを1つ減らします
-
-
-
Aがゼロ以外、またはBがゼロ以外の場合
-
Aがゼロ以外で、(retのサイズ<2または(retのサイズ> =2およびretの最後の要素=retの最後から2番目の要素)でなく、retの最後の要素が「a」の場合)
-
ret:=ret +‘a’、Aを1減らします
-
Bがゼロ以外の場合
-
ret:=ret連結「b」、Bを1つ減らします
-
-
それ以外の場合は、「b」をret連結し、Bを1減らし、Aが0でない場合は、aをretと連結し、Aを1減らします
。
-
-
-
retを返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; class Solution { public: string strWithout3a3b(int A, int B) { string ret = ""; while(abs(A - B) >= 2){ if(A > B){ ret += 'a'; ret += 'a'; A -= 2; if(B) { ret += 'b'; B--; } }else{ ret += 'b'; ret += 'b'; B -= 2; if(A) { ret += 'a'; A--; } } } while(A || B){ if(A && (ret.size() < 2 || !(ret.size() >= 2 && ret[ret.size() - 1] == ret[ret.size() - 2] && ret[ret.size() - 1] == 'a') ) ){ ret += 'a'; A--; if(B) { ret += 'b'; B--; } }else{ ret += 'b'; B--; if(A) { ret += 'a'; A--; } } } return ret; } }; main(){ Solution ob; cout << (ob.strWithout3a3b(4, 1)); }
入力
4 1
出力
"aabaa"
-
C++でゲームVをジャンプする
arrと呼ばれる整数の配列と整数dがあるとします。 1つのステップで、インデックスiから-にジャンプできます。 i + xここで、i +x
-
C ++で文字列をトークン化しますか?
最初の方法は、文字列ストリームを使用して、スペースで区切られた単語を読み取ることです。これは少し制限されていますが、適切なチェックを提供すれば、タスクはかなりうまくいきます。 例 #include <vector> #include <string> #include <sstream> using namespace std; int main() { string str("Hello from the dark side"); string tmp; // A string