zoukankan      html  css  js  c++  java
  • 串替换

    串替换:设串S="aqpbcderstbcdegh",子串T=“bcde",子串V="ff",实现子串V替代所有主串S中出现的和子串T相等的不重叠的子串,原主串S将由串S="aqpbcderstbcdegh",改变为S=“aqpffrstffgh"

    算法思想:串的替换算法由以下几个步骤

    (1)首先要在主串查中找出所有与子串T相等的子串,因此可以进行子串定位

    (2)找出与子串T相等的所有子串的每一个开始位置,然后再依次用子串V做相应的替换

    (3)由于子串T和子串V的长度不同,要改变原串S的长度

    (4)如扫描完主串S的全部字符,未能找到与子串相等的子串,则主串S保持原样,不做任何替换

    算法描述如下:

     1 typedef struct /*定义顺序串结构体*/
     2 {
     3     char ch[MaxSize];
     4     int Length;
     5 
     6 }SeqString;/*SeqString是顺序串类型*/
     7 SeqString ss,tt,vv;/*定义全局共变量*/
     8 void StrReplace(SeqString S,SeqString T,SeqString V)/*替代函数*/
     9 {
    10     int i,j,k,n,m;/*定义局部变量*/
    11     for(i=0;i<S.Length;i++)/*扫描主串中S中的每个字符*/
    12     for(j=i,k=0;S.ch[j]==T.ch[k];j++,k++)
    13         /*子串T中的字符依次与主串S中的字符比较*/
    14     {
    15         /*printf("j=%d k=%d
    ",j,k);*/
    16         if(k==T.Length-1)
    17             /*当K值与子串T长度相等,则找出与子串T相等的字串*/
    18             if(V.Length<=T.Length)/*当子串V的长度小于等于子串T的长度时*/
    19         {
    20             /*printf("===>i=%d k=%d
    ",i,k);*/
    21             for(n=i,k=0;k<V.Length;n++,k++)
    22                 S.ch[n]=V.ch[k];/*用子串V代替主串S中与子串T相等的字串*/
    23             S.Length=S.Length-T.Length+V.Length;
    24             /*重新计算主串S的长度*/
    25             i=n;
    26             /*跳过已经替代的字串,将i值定位到主串中尚未比较过的位置*/
    27             m=T.Length-V.Length;/*计算子串T与子串V的长度差*/
    28             if(m!=0)
    29                 for(;n<S.Length;n++)
    30                 S.ch[n]=S.ch[n+m];/*将子串V未能替代且已经比较过的主串S中多余的字符删除*/
    31             break;/*跳出当前for循环,进行新一轮的比较*/
    32            
    33             }
    34             else/*当子串V的长度大于子串T的长度时*/
    35             {
    36                 m=V.Length-T.Length;
    37                 S.Length=S.Length+V.Length-T.Length;/*重新计算主串S的长度*/
    38                 printf("
    Length222=======%d
    ",S.Length);
    39                 for(n=S.Length;n>i;n--)
    40                     S.ch[n+m-1]=S.ch[n-1];/*预留出要替代的字串的存放位置*/
    41                 for(k=0;k<V.Length;k++,n++)
    42                 {
    43                     S.ch[n]=V.ch[k];
    44                     printf("k=%d n=%d 
    ",k,n);
    45                 }/*用于串V的字串替代主串S中与子串T相等的字串*/
    46                 i=n;
    47                 /*跳过已经替代的字串,将i值定位到主串中尚未比较过的位置*/
    48                 outlin(S);
    49                 break;/*跳出当前for循环,进行新一轮的比较*/
    50             }
    51         }
    52         outlin(S);
    53     }
    View Code
  • 相关阅读:
    uva 11995 I Can Guess the Data Structure!
    poj 1981 Circle and Points
    hdoj 2149 Public Sale
    hdoj 2188 悼念512汶川大地震遇难同胞——选拔志愿者
    hdoj 1846 Brave Game
    vue 细节注意
    meta标签设置不缓存
    -webkit-overflow-scrolling
    ios上表单默认样式
    vue-cli项目上传到github预览问题
  • 原文地址:https://www.cnblogs.com/lqs-zsjky/p/4461840.html
Copyright © 2011-2022 走看看