输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序(递归方法)

[cpp]  view plain copy
  1. //************************************************************************  
  2. //功能:输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序。即输出125、126、145、146.  
  3. //参数:fir_str,第一个字符串;           
  4. //          sec_str,第二个字符串;    
  5. //          sec_str_length,第二个字符串长度;  
  6. //         tab[],存放连接次序的数组;    
  7. //          depth,字符串遍历深度;        
  8. //          position,存放字符串2中每个字符在字符串1中的位置  
  9. //日期:2013.7.26  
  10. //*************************************************************************//  
  11. #include<stdio.h>  
  12. #include<string.h>  
  13. #include<stdlib.h>  
  14.   
  15. void display(char *fir_str,char *sec_str,char sec_str_length,int tab[],char depth,int position)  
  16. {  
  17.     int i;  
  18.     if(depth==sec_str_length)  
  19.     {  
  20.         for(i=0;i<depth;i++)  
  21.         {  
  22.             printf("%d",tab[i]);  
  23.         }  
  24.         printf("\n");  
  25.     }  
  26.     else  
  27.     {  
  28.         while(*fir_str)               //将字符串1中的字符同字符串2中的比较,直到找到与2中一样的字符sec_str才执行++  
  29.         {  
  30.             if(*fir_str== *sec_str)  
  31.             {  
  32.                 tab[depth]=position+1;  
  33.                 display(fir_str+1,sec_str+1,sec_str_length,tab,depth+1,position+1);//这个地方的len在主函数调用时,用strlen(fir_str),因为fir_str变化了,所以len随之变化;tab不要写成了tab[]  
  34.             }  
  35.             fir_str++;  
  36.             position++;  
  37.         }  
  38.     }  
  39. }  
  40. int main()  
  41. {  
  42.     int tab[100];  
  43.     char *string1="abdbcc";  
  44.     char *string2="abc";  
  45.     display(string1,string2,strlen(string2),tab,0,0);  
  46.     system("pause");  
  47.     return 0;  
  48. }  

思路分析:

[cpp]  view plain copy
  1. /************************************************************** 
  2. 举例: 
  3. char *string1="aabdbcc"; 
  4. char *string2="abc";         
  5. 'a'位置:       1            2 
  6.                /   \        /   \ 
  7. 'b'位置:    3     5      3     5 
  8.              / \   / \    / \   / \ 
  9. 'c'位置:  6   7 6   7  6   7 6   7 
  10. while大循环里,首先在string1中找到第一个‘a’字符,然后用递归方法在剩下的“abdbcc”中以同样的方式找‘b’,然后‘c’...... 
  11. 同理,第一次while循环结束,fir_str++,又在第二个位置发现了第二个‘a’,然后接着再递归找‘b’、‘c’,如此直到string1遍历完 
  12. while(*fir_str)               //将字符串1中的字符同字符串2中的比较,直到找到与2中一样的字符sec_str才执行++ 
  13. { 
  14.     ......; 
  15.     fir_str++; 
  16.     position++; 
  17. }    
  18. 也可以这样写: 
  19. for(;*fir_str!='\0';fir_str++,position); 
  20. 或许好理解一些。 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值