问题描述: 输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序。即输出125,126,145,146。
该题是程序员面试宝典关于递归问题的一个题,初看比较简单,不就是建立一个strlen(“abc”)层的多叉树嘛,然后从上到下,从左到右输出即可,可是在编写程序的过程中却遇到了问题,始终把书上给的递归过程想不明白,于是就自己动手写了个程序。
1 #include <iostream> 2 #include<string.h> 3 #include<list> 4 using namespace std; 5 6 list<int>list1; 7 8 void findLink(const char *p1, const char *p2, int i, int j) 9 { 10 if(!p1[i] || !p2[j]) 11 return ; 12 if(p2[j] == p1[i] && !p2[j + 1]) 13 { 14 for(list<int>::iterator it = list1.begin(); it != list1.end(); it++) 15 { 16 cout << *it << " "; 17 } 18 cout << i + 1 << endl; 19 } 20 if(p1[i] == p2[j]) 21 { 22 list1.push_back(i + 1); 23 findLink(p1, p2, i + 1, j + 1); 24 list1.pop_back(); 25 } 26 findLink(p1, p2, i + 1, j); 27 } 28 int main() 29 { 30 char p[10] = "abdbccd"; 31 char q[10] = "abc"; 32 findLink(p, q, 0, 0); 33 return 0; 34 }
书上的:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 5 using namespace std; 6 7 void PrintfArray(char *p_str, char *s_str, int *print_arr, int p_len, int s_len, int print_arr_num, int p_start_num, int s_start_num) 8 { 9 int pStartNum = p_start_num; 10 int sStartNum = s_start_num; 11 int printNum = print_arr_num; 12 if(printNum == s_len) 13 { 14 for(int i = 0; i < s_len; i++) 15 { 16 cout << *(print_arr + i); 17 cout << " "; 18 } 19 cout << endl; 20 return; 21 } 22 23 for(int i = pStartNum; i < p_len; i++) 24 { 25 for(int j = sStartNum; j < s_len; j++) 26 { 27 if(*(p_str + i) == *(s_str + j)) 28 { 29 print_arr[printNum] = i + 1; 30 pStartNum = i; 31 sStartNum = j; 32 PrintfArray(p_str, s_str, print_arr, p_len, s_len, printNum + 1, pStartNum + 1, sStartNum + 1); 33 } 34 } 35 } 36 } 37 38 void ConnectSequence(char *p_str, char *s_str) 39 { 40 int p_len = strlen(p_str); 41 int s_len = strlen(s_str); 42 int *print_arr = new int[s_len]; 43 unsigned int print_arr_num = 0; 44 45 if(NULL == p_str && NULL == s_str) 46 { 47 cout << "string error"<< endl; 48 return; 49 } 50 if(NULL == print_arr) 51 { 52 cout << "allocate memory error" << endl; 53 return; 54 } 55 PrintfArray(p_str, s_str, print_arr, p_len, s_len, 0, 0, 0); 56 } 57 58 int main() 59 { 60 char ParString[] = "abdbcc"; 61 char SonString[] = "abc"; 62 ConnectSequence(ParString, SonString); 63 return 0; 64 }
本人觉得这段代码的可读性不好