A . Minimum Excluded String [ 问题 7945 ] [ 讨论 ]
描述
我们将最小排除 (mex) 字符串定义为不包含在给定字符串中的最小字符串。如果一个字符串的长度更短,则该字符串被认为小于另一个字符串。如果它们的长度相等,则我们从左到右逐个字符地比较它们。我们发现不等字符的第一个位置,我们说包含字母表中较早字符的字符串较小。例如,“orange”比“blueberry”小(基于长度),“autocratic”比“automobile”小(基于“c”在字母表中比“m”更早)。
给定一个字符串,找到该给定字符串的 mex 字符串。
输入
输入的第一行以单个正整数开头, 吨,表示要处理的字符串数。然后,吨 行,每行包含一个字符串, 秒, 长度在 1 到 500 个字母之间(含)。保证字符串只包含小写字母。
输出
对于每个字符串,输出输入字符串的单行 mex 字符串
样品
Input 复制
2
banana
abcdefghijklmnopqrstuvwxyz
Output
c
aa
Source
找不属于当前字符串的最小字符串
长度小的优先
长度一样的时候 string直接比大小
可以直接猜测
字符串长度为1-500
1 .如果这个字符串没有出现26个字符中的任意一个 ,直接输出即可,因为长度为1 是最优秀的
2. 按理说接着看长度为2的 从“aa”模拟 ->“az”->“ba”—>“zz” -> “aaa” 直接递推
如果找到不一样的直接可以输出这个模拟量
但如果模拟太多就会t 我们可以看 aa-az 总共26个 长度为26*2=52; 如果这样的话 到第十个就500了
所以只需要模拟长度为2的即可 我们在存字符串的时候直接模拟两位即可 用set去重
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,cnt=0;
int main(){
map<char,int>mp;
cin>>n;
while(n--){
set<string>q;
string s;
mp.clear();
cin>>s;
for(int i=0;i<s.size();i++){
mp[s[i]]=1;
}
int flag=0;
for(int i='a'-'a';i<='z'-'a';i++){
if(!mp[char('a'+i)]){
flag=1;
printf("%c\n",char('a'+i));
break;
}
}
if(flag) continue;
if(!flag){
for(int i=0;i<s.size()-1;i++){
for(int j=2;j<=s.size()-i&&j<=2;j++)
q.insert(s.substr(i,j));
}
//for(int i=0;i<cnt;i++) cout<<e[i].s<<endl;
string now="aa";
int fg=0;
for(auto i:q){
// cout<<i<<endl;
if(i!=now){
cout<<now<<endl;
fg=1;
break;
}
int len=now.size()-1;
while(len>=0&&char(now[len])=='z'){
now[len]='a';
len--;
}
if(len>=0)
now[len]=char(now[len]+1);
// cout<<now[len]<<endl;
if(len<0)
now="a"+now;
}
if(!fg) cout<<now<<endl;
}
}
return 0;
}
寻找字符串的最小排除(mex)字符串
这篇博客讨论了一种定义为不包含在给定字符串中的最小字符串——最小排除(mex)字符串。文章提供了输入输出示例,并解释了解决此问题的算法策略,包括如何处理不同长度的字符串和字母表顺序。给出的C++代码实现用于找到给定字符串的mex字符串,通过检查字符出现情况并进行模拟来找到最小排除字符串。
715

被折叠的 条评论
为什么被折叠?



