题目:使用递归算法查找字符串中相同字符连续出现的最大次数
举例:输入“aaabbc”,输出3
分析:问题实质上是“查找字符串中相同字符连续出现的最大次数”,关键是限制了只允许使用递归的方法。
思路:
1、非递归的情况:连续字符的问题可以通过设置前后指针,不断移动比较两个指针的值即可解决。
int CountMaxNumOfChar(const char *str) {
if (str == NULL || *str == '\0') return 0;
const char *pBefore = str;
int max = 1;
int cur = 1;
while (*++pBefore) {
if (*pBefore == *str) {
++ cur;
max = cur > max ? cur : max;
}
else {
str = pBefore;
cur = 1;
}
}
return max;
}
2、递归的情况:递归要把问题分解成与原问题同类型的子问题,这里考虑把一个字符串的最大连续字符次数分解为求第一个字符的连续的次数,若不为当前最大,继续向后考虑子串,直到遍历全部字符串。这里需要保存第一个字符已经出现的次数和当前最大的次数。递归里面保存传递数据,可以使用参数传递,也可以考虑使用静态变量(求阶乘中有使用)。这里统计第一个字符的次数使用静态变量,保存当前最大使用参数传递。
void CountMaxNumOfCharCore(const char *str, int *max) {
static int count = 1;
if (*str) {
if (*str == *(str - 1))
*max = ++ count > *max ? count : *max;
else
count = 1;
CountMaxNumOfCharCore(++str, max);
}
}
int CountMaxNumOfCharRecursive(const char *str) {
if (str == NULL || *str == '\0') return 0;
if (*++str == '\0') return 1;
int max = 1;
CountMaxNumOfCharCore(str, &max);
return max;
}
PS:百度,2013,校招,笔试
参考: [1]http://blog.csdn.net/zyy5411/article/details/8104493