题目大意:给你字符串s,和t,字符串s中的‘?‘可以用字符串t中的字符代替,要求使得最后得到的字符串s(可以将s中的字符位置两两交换,任意位置任意次数)中含有的子串t最多。
解题思路: 因为知道s中的字符位置可以交换无数次,所以只要s中含有可以组成t的字符就一定可以出现子串t。所以就是要令t中的字符数量尽量平均地分布在s中。
代码:
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int str[300]; 5 6 int main(){ 7 string s,t; 8 cin>>s>>t; 9 for(int i=0;i<s.size();i++){ 10 if(s[i]!=‘?‘) 11 str[s[i]-‘a‘]++; 12 } 13 int k=0; 14 int d=t.size(); 15 for(int i=0;i<s.size();i++){ 16 if(s[i]==‘?‘){ 17 k++; 18 k%=d; 19 //说明这个字符出现次数比较多,把机会让给出现次数较少的字符 20 if(str[t[k]-‘a‘]>0){ 21 str[t[k]-‘a‘]--; 22 i--; 23 } 24 else 25 s[i]=t[k]; 26 } 27 } 28 cout<<s<<endl; 29 return 0; 30 }
时间: 2024-10-02 22:15:35