程序员面试宝典 8.2 典型递归问题: 面试例题1: 输入两个字符串,比如 abdbcc 和 abc, 输出第二个字符串在第一个字符串中的连接次序。即输出 125, 126, 145, 146.
2013-03-01 14:28
591 查看
程序员面试宝典 8.2 典型递归问题:
面试例题1: 输入两个字符串,比如 abdbcc 和 abc, 输出第二个字符串在第一个字符串中的连接次序。即输出 125, 126, 145, 146.
【好久木有做过题了,初看,木有看懂,敲了一遍,木有输出。仔细一看,修改如下:】
原因:
先找到 子串 在 父串 中所在位置:
1 //a
2 4 //b
5 6 5 6 //c
所以要先遍历子串嘛 (yib为例)
如果找到一个位置
横向上j++ 找到下一个b在父串中的位置4
深度上,递归遍历的时候 sStart+1 很好理解,表示要找 子串的下一个字符的位置(c的位置 5 6),pStart + 1 是为了重复已经遍历过的位置,跳到父节点的另一个孩纸节点。
递归总是想啊想的 才能想好 肿么办。。。。
还是不是很懂吧。。。
面试例题1: 输入两个字符串,比如 abdbcc 和 abc, 输出第二个字符串在第一个字符串中的连接次序。即输出 125, 126, 145, 146.
【好久木有做过题了,初看,木有看懂,敲了一遍,木有输出。仔细一看,修改如下:】
原因:
先找到 子串 在 父串 中所在位置:
1 //a
2 4 //b
5 6 5 6 //c
所以要先遍历子串嘛 (yib为例)
for(int i = sStart; i < s_len; i++)
如果找到一个位置
if( *(p_str + j) == *(s_str + i))深度上交给递归去继续遍历下一个 子串中的字母 在 父串 中的位置(c 对应的 5 6)
横向上j++ 找到下一个b在父串中的位置4
深度上,递归遍历的时候 sStart+1 很好理解,表示要找 子串的下一个字符的位置(c的位置 5 6),pStart + 1 是为了重复已经遍历过的位置,跳到父节点的另一个孩纸节点。
// Find_Place.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <stdio.h> #include<string.h> using namespace std; void PrintArray(char *p_str, char *s_str, int *print_array, int p_len, int s_len, int print_num, int p_start, int s_start) { int pStart = p_start; int sStart = p_start; int printNum = print_num; if(printNum == s_len) { for(int i = 0; i < s_len; i++) { cout<<print_array[i]; //cout<<"ok"; cout<<" "; } cout<<endl; return; } for(int i = sStart; i < s_len; i++) { for(int j = pStart; j < p_len; j++) { if( *(p_str + j) == *(s_str + i)) { print_array[printNum] = j + 1; pStart = i; sStart = j; PrintArray(p_str, s_str, print_array, p_len, s_len, printNum + 1, pStart + 1, sStart + 1); } } } } void ConnectSequence(char *ParString, char *SonString) { int p_len = strlen(ParString); int s_len = strlen(SonString); //int *printArray = (int *)malloc(sizeof(int) * s_len); int *printArray = new int[s_len]; unsigned int print_num = 0; if(ParString == NULL && SonString == NULL) { cout<<"no string !"<<endl; return; } if(printArray == NULL) { cout<<"allocate error"<<endl; return; } PrintArray(ParString, SonString, printArray, p_len, s_len, 0, 0, 0); } int _tmain(int argc, _TCHAR* argv[]) { char ParString[] = "abdbcc"; char SonString[] = "abc"; ConnectSequence(ParString, SonString); getchar(); return 0; }
递归总是想啊想的 才能想好 肿么办。。。。
还是不是很懂吧。。。
相关文章推荐
- 程序员面试宝典之输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序,即输出125,126,145,146
- 《程序员面试宝典》:输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序,即输出125,126,145,146
- 输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序(递归方法)
- 输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序(递归方法)
- 输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序(递归方法)
- 输入两个字符串,比如abdbcc和abc,输出第二个字符串在第一个字符串中的连接次序
- 输入两个字符串,比如abdcc和abc,输出第二个字符串在第一个字符串中的连接次序
- 输入两个字符串,比如abdbcc和abc,把abc在abdbcc中的连接次序输出
- 输入两个字符串,输出第二个字符串在第一个字符串中的连接次序
- 程序员面试宝典_8.2_典型递归问题_面试例题1
- 字符串问题:输出第二个字符串在第一个字符串中的连接次序
- 【程序员面试宝典】递归之两个字符串连接次序问题(P83)
- 【程序员面试宝典】递归之两个字符串连接次序问题(P83)
- 输出第二个字符串在第一个字符串中的连接次序
- 《程序员面试宝典》求取第二个字符串在第一个字符串中的连接次序---递归算法
- java--封装一类Java对象,用户从输入对话框输入两个日期,程序将判断两个日期的大小关系(比如输出:您输入的第二个日期大于第一个日期)以及两个日期之间的间隔天数(比如输出:2006年6月6日和
- C语言:从键盘输入两个字符串,输出第一个字符串在第二个字符串中的位置
- 编写一个函数 接受两个字符串参数 如果 第一个参数被第二个包含 则输出第一个参数的首字符(图)
- js 输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符串
- 程序员面试宝典8.2典型递归问题