目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
题目很长,简而言之就是检查字符串中对应索引的位置是否有特定的字符串,如果有,那么替换,返回替换后的字符串。
这道题还算是没有刁难我们了,连可能要替换的索引都告诉我们了。
那么我们直接遍历每个下标,查询该位置的子串是否是特定的字符串,如果是,那么就删除特定字符串,再把要替换的字符串插入进去。
不过这样就有一个问题,那就是删除的字符串和替换的字符串长度不一定一致,那么我们这么一操作,就会导致下标错位。
那我们应该怎么做呢,如果我们从较后面的下标开始替换,那么替换后也不会影响在较前面的下标了,所以我们可以从后面的下标开始往前替换。
我们可以利用map按照键默认升序的特性,以下标为键,以对应位置的特定字符串和替换字符串为键。接着反着遍历map,去检查每个下标的位置是否有特定字符串,有则替换。
代码:
class Solution {
public:
string findReplaceString(string s, vector<int>& indices, vector<string>& sources, vector<string>& targets) {
int k=indices.size();
map<int,vector<string>>m; //按照默认升序存放索引,目标字符串,替换字符串
for(int i=0;i<k;i++) m[indices[i]]={sources[i],targets[i]};
//从右开始,这样键值就会是降序的,替换字符串后,接下来的下标不被影响
for(auto i=m.rbegin();i!=m.rend();i++){
//如果对应索引位置是目标字符串,那么替换
if(s.substr(i->first,i->second[0].size())==i->second[0]){
//先删除原先目标字符串
s.erase(i->first,i->second[0].size());
//再插入替换字符串
s.insert(i->first,i->second[1]);
}
}
return s;
}
};