你会得到一个字符串 s (索引从 0 开始),你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出:indices, sources, targets。
要完成第 i 个替换操作:
检查 子字符串 sources[i] 是否出现在 原字符串 s 的索引 indices[i] 处。
如果没有出现, 什么也不做 。
如果出现,则用 targets[i] 替换 该子字符串。
例如,如果 s = “abcd” , indices[i] = 0 , sources[i] = “ab”, targets[i] = “eee” ,那么替换的结果将是 “eeecd” 。
所有替换操作必须 同时 发生,这意味着替换操作不应该影响彼此的索引。测试用例保证元素间不会重叠 。
例如,一个 s = "abc" , indices = [0,1] , sources = ["ab","bc"] 的测试用例将不会生成,因为 "ab" 和 "bc" 替换重叠。
在对 s 执行所有替换操作后返回 结果字符串 。
子字符串 是字符串中连续的字符序列。
示例 1:
输入:s = “abcd”, indexes = [0,2], sources = [“a”,“cd”], targets = [“eee”,“ffff”]
输出:“eeebffff”
解释:
“a” 从 s 中的索引 0 开始,所以它被替换为 “eee”。
“cd” 从 s 中的索引 2 开始,所以它被替换为 “ffff”。
示例 2:
输入:s = “abcd”, indexes = [0,2], sources = [“ab”,“ec”], targets = [“eee”,“ffff”]
输出:“eeecd”
解释:
“ab” 从 s 中的索引 0 开始,所以它被替换为 “eee”。
“ec” 没有从原始的 S 中的索引 2 开始,所以它没有被替换。
这一题,我们先判别数组中各个位置是否需要背替换,之后再替换的过程中再单独处理,不要一口吃成一个胖子,这样编程设计更容易理解和编程,解题代码如下:
bool euqal(char *a,char *b){
int i=0;
while(a[i]!='\0'&&b[i]!='\0'){
// printf("-- %c %c ",a[i],b[i]);
if(a[i]!=b[i]){
break;
}
i++;
}
if(b[i]=='\0'){
if(i-1==0){
a[0]='*';
}
else{
a[0]='#';
a[i-1]='#';
}
return true;
}
return false;
}
char * findReplaceString(char * s, int* indices, int indicesSize, char ** sources, int sourcesSize, char ** targets, int targetsSize){
int r[indicesSize];
for(int i=0;i<indicesSize;i++){
if(euqal(s+indices[i],sources[i])){
r[i]=1;
}
else{
r[i]=0;
}
// printf("%d ",r[i]);
}
char *re=(char *)malloc(sizeof(char)*(30*indicesSize));
int size=0;
int index=0;
for(int i=0;s[i]!='\0';){
//printf("-- %c %d ",s[i],i);
if(s[i]=='\0'){
re[size]='\0';
break;
}
else if(s[i]=='#'){
for(int k=0;k<indicesSize;k++){
if(indices[k]==i){
index=k;
break;
}
}
i=i+1;
while(s[i]!='#'){
i++;
}
i++;
for(int j=0;targets[index][j]!='\0';j++){
re[size++]=targets[index][j];
}
}
else if(s[i]=='*'){
for(int k=0;k<indicesSize;k++){
if(indices[k]==i){
index=k;
break;
}
}
i++;
for(int j=0;targets[index][j]!='\0';j++){
re[size++]=targets[index][j];
}
}
else{
re[size++]=s[i++];
}
}
re[size]='\0';
return re;
}