C++での文字列の順列
2つの文字列s1とs2があるとすると、s2にs1の順列が含まれている場合にtrueを返す関数を作成する必要があります。したがって、最初の文字列の順列の1つは、2番目の文字列の部分文字列であると言えます。したがって、文字列s1 =“ abc”で、2番目の文字列s2が“ findcab”の場合、“ abc”の順列が真であるため、結果は真になります。それが「タクシー」です。
これを解決するには、次の手順に従います-
- サイズ26の2つのベクトルcnt1とcnt2を作成します
- 0からs1の範囲のiの場合
- cnt1 [s1 [i] –‘a’]の値を1増やします
- j:=0および必須:=s1のサイズ
- 0からs2のサイズの範囲のiの場合
- x:=s2 [i]
- cnt2 [x –‘a’]を1増やします
- cnt1 [x –‘a’]およびcnt2 [x –‘a’] <=cnt [x –‘a’]の場合、
- 1で必要な減少
- j<=iおよびcnt2[s2[j] –‘a’] – 1> =cnt1 [s2 [j] –‘a’]の場合、実行
- cnt2 [s2 [j] –‘a’]を1つ減らします
- jを1増やします
- i – j + 1 =s1のサイズで、required =0の場合、trueを返します
- falseを返します。
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class Solution { public: bool checkInclusion(string s1, string s2) { vector <int> cnt1(26), cnt2(26); for(int i = 0; i < s1.size(); i++)cnt1[s1[i] - 'a']++; int j = 0; int required = s1.size(); for(int i = 0; i < s2.size(); i++){ char x = s2[i]; cnt2[x - 'a']++; if(cnt1[x - 'a'] && cnt2[x - 'a'] <= cnt1[x - 'a']) required--; while(j <= i && cnt2[s2[j] - 'a'] - 1 >= cnt1[s2[j] - 'a']){ cnt2[s2[j] - 'a']--; j++; } if(i - j + 1 == s1.size() && required == 0){ return true; } } return false; } }; main(){ Solution ob; cout << (ob.checkInclusion("abc", "findcab")); }
入力
"abc" "findcab"
出力
1
-
C++での文字列のトークン化
このセクションでは、C++で文字列をトークン化する方法を説明します。 Cでは、文字配列にstrtok()関数を使用できます。ここに文字列クラスがあります。次に、その文字列から区切り文字を使用して文字列を切り取る方法を説明します。 C ++機能を使用するには、文字列を文字列ストリームに変換する必要があります。次に、getline()関数を使用して、タスクを実行できます。 getline()関数は、文字列ストリーム、出力を送信するための別の文字列、およびストリームのスキャンを停止するための区切り文字を受け取ります。 関数がどのように機能しているかを理解するために、次の例を見てみましょう。 サン
-
C ++で文字列をトークン化しますか?
最初の方法は、文字列ストリームを使用して、スペースで区切られた単語を読み取ることです。これは少し制限されていますが、適切なチェックを提供すれば、タスクはかなりうまくいきます。 例 #include <vector> #include <string> #include <sstream> using namespace std; int main() { string str("Hello from the dark side"); string tmp; // A string