今日学习记录
1. 3720. 大于目标字符串的最小字典序排列
关键词:dfs
问题分析:
给两个字符串 s1,s2,要求把 s1 变成字典序严格大于 s2 的最小字符序列
核心思路:
字典序爆搜+回溯
第一眼看到最大的最小以为是二分,但是这个题字符串不能像二分那样找到对应的中间值,再就是暴力模拟了,搜集 s1 的字符,进行排序,从 s2 的第一个
**最终代码:
int n = s.size();
vector<int> cnt(26);
for(char &c:s) cnt[c-'a']++;
string ans = "";
auto dfs = [&](this auto&& dfs,int i,string &str)->bool{
if(i==n){
if(str>target){
ans = str;
return true;
}
return false;
}
if(cnt[target[i]-'a']>0){
cnt[target[i]-'a']--;
str += target[i];
if(dfs(i+1,str)) return true;
str.pop_back();
cnt[target[i]-'a']++;
}
for(char c = target[i]+1;c<='z';c++){
if(cnt[c-'a']>0){
string temp = str;
temp += c;
cnt[c-'a']--;
for(int i = 0;i<26;i++){
for(int j = 0;j<cnt[i];j++){
temp += 'a'+i;
}
}
cnt[c-'a']++;
ans = temp;
return true;
}
}
return false;
};
string arr = "";
dfs(0,arr);
return ans ;
}学到的点: 1.