串替換

串替換:設串S="aqpbcderstbcdegh",子串T=「bcde",子串V="ff",實現子串V替代全部主串S中出現的和子串T相等的不重疊的子串,原主串S將由串S="aqpbcderstbcdegh",改變爲S=「aqpffrstffgh"算法

算法思想:串的替換算法由如下幾個步驟ide

(1)首先要在主串查中找出全部與子串T相等的子串,所以能夠進行子串定位函數

(2)找出與子串T相等的全部子串的每個開始位置,而後再依次用子串V作相應的替換spa

(3)因爲子串T和子串V的長度不一樣,要改變原串S的長度code

(4)如掃描完主串S的所有字符,未能找到與子串相等的子串,則主串S保持原樣,不作任何替換blog

算法描述以下:for循環

 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\n",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\n",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("\nLength222=======%d\n",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 \n",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
相關文章
相關標籤/搜索