トピック:
文字列 s を指定すると、任意の文字を任意の小文字に変換できます。この操作は m 回実行でき、変換された文字列内の最も長い等しい部分文字列の長さが求められます。
場合:
s="abcdac"、m=2、2 つの演算は、"abcccc" に変換できます。最長は 4 で、4 を返します。
分析します:
このトピックは理解しやすいですが、アルゴリズムを完全に理解していない生徒や、スライディング ウィンドウとダブルポインター アルゴリズムを理解していない生徒にとっては、まだ少し難しいです。文字列の任意の文字を別の文字に変更できます。スライディング ウィンドウのダブル ポインタを優先して書き込む
mp
left と right を left と right ポインターとして定義し、文字列内の各文字の出現回数を記録する辞書を定義します。文字列 s を 1 回トラバースし、各サイクルは次のように実行されます。右-左 +1 (現在のウィンドウの長さ) - mp 辞書の最大値 (max_value) の場合、添字要素に対応する文字は +1 になります。m、それはいいえを意味します。現在の mp 添字要素に対応する文字、left+1 を減算することで、このような操作を完了することができます。再度右-左+1(現在のウィンドウの長さ) - mp辞書の最大数(max_value) > mの演算を実行すると、直接的にはこの判定文が満たされません。終了後、right-left+1 の文字列が任意の文字を任意の小文字に変換する操作を m 回満たしていることがわかります。max_lengthと比較して最大値をとる。
mp: 文字列 s のスライディング ウィンドウ [左、右] 内の文字に対応する文字数であることが保証されます。
max_value: スライディング ウィンドウの文字数の最大値
max_length: m 回の操作後の最長の等しい部分文字列の長さ
件名コード:
#include<iostream>
#include<unordered_map>
using namespace std;
int main()
{
string s;
int m;
cin>>s;
cin>>m;
unordered_map<char,int>mp;
int left=0;
int max_lenth=0;
for(int right=0;right<s.size();right++)
{
mp[s[right]]++;
int max_value=0;
for(int i=0;i<26;i++)
{
char ch='a'+i;
max_value=max(max_value,mp[ch]);
}
while(right-left+1-max_value>m)
{
mp[s[left]]--;
left++;
}
max_lenth=max(max_lenth,right-left+1);
}
cout<<max_lenth<<endl;
}