• 833. 字符串中的查找与替换-利用数组先判后补法-力扣双百代码


    833. 字符串中的查找与替换-利用数组先判后补法

    你会得到一个字符串 s (索引从 0 开始),你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出:indices, sources, targets。

    要完成第 i 个替换操作:

    检查 子字符串  sources[i] 是否出现在 原字符串 s 的索引 indices[i] 处。
    如果没有出现, 什么也不做 。
    如果出现,则用 targets[i] 替换 该子字符串。
    
    • 1
    • 2
    • 3

    例如,如果 s = “abcd” , indices[i] = 0 , sources[i] = “ab”, targets[i] = “eee” ,那么替换的结果将是 “eeecd” 。

    所有替换操作必须 同时 发生,这意味着替换操作不应该影响彼此的索引。测试用例保证元素间不会重叠 。

    例如,一个 s = "abc" ,  indices = [0,1] , sources = ["ab","bc"] 的测试用例将不会生成,因为 "ab" 和 "bc" 替换重叠。
    
    • 1

    在对 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;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
  • 相关阅读:
    MATLAB算法实战应用案例精讲-【智能优化算法】算术优化算法-AOA(附matlab代码)
    【Python】深入解析Python中的eval()函数
    什么是分子优化(Molecule Optimization)以及相关论文
    第二章:整数二分与浮点数二分(极限思想)
    【牛客-剑指offer-数据结构篇】【图解】JZ27 二叉树的镜像 Java实现
    [C# SDK/IDE]-VSCode 搭建 C# 开发环境
    Kconfig 和 Kbuild
    Mybatis 动态语言 - mybatis-freemarker
    Linux(三)- Vi 和 Vim 编辑器
    泰山OFFICE技术讲座:着重号的大小与字号关系
  • 原文地址:https://blog.csdn.net/weixin_43327597/article/details/127127608