《剑指Offer》:求字符串的组合
来源:互联网 发布:java 泛型类获取class 编辑:程序博客网 时间:2024/05/13 23:45
前言
最近一个月多的时间一直在刷剑指Offer,刚做到第28题 -- 字符串的排列。然后,在做扩展题的时候,来了个神来之笔,心情大好,分享下。
题目:
解决思路:
求字符串的组合问题,可以分解成求长度为1的组合,长度为2的组合,...,长度为n的组合。所以,我们可以将这个题转换成具体求n个字符中长度为m (1 ≤ m ≤ n) 的组合问题。
求长度为m的组合问题,我们将n个字符分成两个部分:第一个字符和剩下所有字符。然后我们就可以将求n个字符中长度为m的组合问题继续分解成以下两个子问题:
1. 如果所求的组合里含有第一个字符,则我们只需要求剩下所有字符里长度为m-1的组合;
2. 如果所求的组合里没有含有第一个字符,则我们需要求剩下所有字符里长度为m的组合;
解决这样两个子问题,必须会考虑到用递归。以下是代码实现:
void CombinationCore(char *pComBuff, char *pBegin, unsigned int m){ if (*pBegin == '\0' && m != 0) { return; } if (m == 0) { printf("%s\n", pComBuff); return; } // 包含第一个字符,在剩下的求m-1个字符的组合 pComBuff[m - 1] = *pBegin; // 神来之笔// pComBuff为打印的组合字符串,一直卡在如何给pComBuff赋值的问题这;// 结果一个错误的尝试,完美的解决了这个问题,只是打印的顺序是倒序,一点不违反原题意思。 CombinationCore(pComBuff, (pBegin + 1), (m - 1)); // 不包含第一个字符,在剩下的求m个字符的组合 CombinationCore(pComBuff, (pBegin + 1), m);}void Combination(char* pStr){ if (pStr == NULL) { return; } unsigned int len = strlen(pStr); char *pComBuff = new char[len + 1]; memset(pComBuff, 0, len + 1); for (unsigned int m = 1; m <= len; m++) { CombinationCore(pComBuff, pStr, m); } delete[] pComBuff;}
测试结果:
卡了我半天,结果一个错误尝试无意中搞定,写代码的乐趣,大概就在此了!
0 0
- 《剑指Offer》:求字符串的组合
- 【剑指offer】面试题:求字符串的所有组合
- 【剑指offer】字符串的组合
- 【剑指offer】字符串的组合
- 剑指offer:求字符的所有组合
- [剑指offer]求字符的所有组合
- 【剑指offer】之字符串的组合
- 【剑指offer】字符串的排列与组合
- 剑指offer:字符串的组合(java)
- 《剑指Offer》读书笔记---面试题28:字符串的排列,(扩展:求字符串的所有组合)
- 《剑指Offer》:求字符串的排列
- [剑指offer]求字符数组的所有组合
- 剑指offer(求字符的所有组合)
- 剑指offer 之 字符串的全排列、全组合
- 求字符串的所有组合
- 求字符串的所有组合
- 求字符串的所有组合
- 剑指Offer中面试题28的扩展问题(求字符的所有组合)
- ecshop二次开发 结构分析和代码研究
- vsftp安装配置,以及问题解决
- Valid Number Java
- Android MediaCodec小结
- Java中的加密与解密
- 《剑指Offer》:求字符串的组合
- Remove Duplicates from Sorted List-LeetCode
- 开篇:小打小闹,finish中setResult失效
- [LeetCode][Database]Department Highest Salary
- 实现手机自动关机
- 支持元素惯性拖放和多点触摸手势的js插件
- CMSampleBufferRef TO NSData
- c++中template的是用于解析
- android 照相获取图片路径