- //************************************************************************
- //功能:输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序。即输出125、126、145、146.
- //参数:fir_str,第一个字符串;
- // sec_str,第二个字符串;
- // sec_str_length,第二个字符串长度;
- // tab[],存放连接次序的数组;
- // depth,字符串遍历深度;
- // position,存放字符串2中每个字符在字符串1中的位置
- //日期:2013.7.26
- //*************************************************************************//
- #include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- void display(char *fir_str,char *sec_str,char sec_str_length,int tab[],char depth,int position)
- {
- int i;
- if(depth==sec_str_length)
- {
- for(i=0;i<depth;i++)
- {
- printf("%d",tab[i]);
- }
- printf("\n");
- }
- else
- {
- while(*fir_str) //将字符串1中的字符同字符串2中的比较,直到找到与2中一样的字符sec_str才执行++
- {
- if(*fir_str== *sec_str)
- {
- tab[depth]=position+1;
- display(fir_str+1,sec_str+1,sec_str_length,tab,depth+1,position+1);//这个地方的len在主函数调用时,用strlen(fir_str),因为fir_str变化了,所以len随之变化;tab不要写成了tab[]
- }
- fir_str++;
- position++;
- }
- }
- }
- int main()
- {
- int tab[100];
- char *string1="abdbcc";
- char *string2="abc";
- display(string1,string2,strlen(string2),tab,0,0);
- system("pause");
- return 0;
- }
思路分析:
- /**************************************************************
- 举例:
- char *string1="aabdbcc";
- char *string2="abc";
- 'a'位置: 1 2
- / \ / \
- 'b'位置: 3 5 3 5
- / \ / \ / \ / \
- 'c'位置: 6 7 6 7 6 7 6 7
- while大循环里,首先在string1中找到第一个‘a’字符,然后用递归方法在剩下的“abdbcc”中以同样的方式找‘b’,然后‘c’......
- 同理,第一次while循环结束,fir_str++,又在第二个位置发现了第二个‘a’,然后接着再递归找‘b’、‘c’,如此直到string1遍历完
- while(*fir_str) //将字符串1中的字符同字符串2中的比较,直到找到与2中一样的字符sec_str才执行++
- {
- ......;
- fir_str++;
- position++;
- }
- 也可以这样写:
- for(;*fir_str!='\0';fir_str++,position);
- 或许好理解一些。