一道递归问题
来源:互联网 发布:mysql 大于等于 编辑:程序博客网 时间:2024/06/05 15:11
题目大意是:给定一个字符串A,然后给定多个单词,然后根据给定的单词在字符串中插入空格,求插入空格最少的组合。例如给定字符串ilikeeverything,给定单词i、like、every、thing、likeeverything。输出为i likeeverything。
#include <iostream>#include <vector>#include <set>#include <map>#include <string>#include<algorithm>#include<functional>using namespace std;string result;int mincount=1000;int count1 = 0;bool flag = false;//注意递归里面最好不要有全局变量,如果返回,注意保存有上次的值。如果想把本次的值传递到下一次递归,//完全可以利用参数传值传递,而且返回后,值不变(变化的注意复原)。(我只是在结束条件满足时获得值即可,中间的值我又不需知道)//local:当前查找的起始位置//resulttemp:暂存结果,因为会有多个解。//blanknum:插入的空格数量//str:要插入空格的字符串//dict:字典(放入的是多个字符串)void mincut(int local,string resulttemp,int blanknum,const string& str, const set<string>& dict){//从起点开始子串依次增长for (int i = 1; i <= str.size()-local; i++){string strtemp = str.substr(local, i);if (dict.find(strtemp) != dict.end())//找到{//先保存找到的子串resulttemp += strtemp;resulttemp += ' ';blanknum++;local = local + i;if (local >= str.size())//判断此次是否符合结束条件,符合就接收最后的解{if (blanknum < mincount)//判断是否是更好的解{flag = true;//只要有一个解,最终就会有解mincount = blanknum;result = resulttemp;//cout << result << endl;}}else//不符合结束条件,就继续{mincut(local, resulttemp, blanknum, str, dict);local = local - i;//复原,开始下次循环,注意。blanknum--;resulttemp.erase(local, resulttemp.size() - local);}}}}int main(int argc, const char * argv[]){string strS="aababa";set<string> dict;result.clear();dict.insert("a");dict.insert("aa");dict.insert("aaa");dict.insert("b");string resulttemp;int blanknum = 0;mincut(0, resulttemp, blanknum, strS, dict);if (flag)cout << result << endl;elsecout << "不存在" << endl;system("pause");return 0;}
注意递归的结束条件,本题使用的方法相当于深度优先搜索,一次查找结束的条件是下次查找的起始位置超出字符串的个数。
特别注意递归后的代码如何写(想下递归返回后自己想要干什么,对于本题我的解法相当于深度优先搜索,所以递归返回后会走另一条路,所以还原一些需要用到的变量)
另一道题是:给定一个字符串A,另外给一个字符串B,问A能组合出多少个B?(A中相对顺序要一致)
例:A:asdad B:asd 输出结果为2
#include <iostream>#include <vector>#include <set>#include <map>#include <string>#include<algorithm>#include<functional>using namespace std;int numcount = 0;void mincut(int strlocal,int dictlocal, const string str, const string dict){if (dictlocal == dict.size()){numcount++;return;}if (strlocal == str.size())return;for (int i = strlocal; i < str.size(); i++){if (str[i] == dict[dictlocal])//找到一个{mincut(i+1, dictlocal+1, str, dict);}}}int main(int argc, const char * argv[]){string strS;string dict;while (cin>>strS>>dict){numcount = 0;mincut(0, 0, strS, dict);cout << numcount << endl;}system("pause");return 0;}
此程序修改的最上面的代码,最上面的代码可以照着下面的修改下,传入变量类似这样写mincut(i+1, dictlocal+1, str, dict),这样就不用还原i及dictlocal了。
阅读全文
0 0
- 一道递归问题
- 用递归解决蓝桥杯的一道排列问题
- 初探“递归”——由一道题目引出的问题
- 一道小递归
- 一道递归题
- 一道递归的好题
- 一道考递归的题目
- 一道循环递归笔试题
- 解一道递归调用题
- 递归的一道简单题
- 一道简单的递归题
- 百度2013年校园招聘一道笔试题--三位密码组合问题递归求解
- 一道动归问题
- 一道编程问题
- 一道组合数问题
- 讨论一道概率论问题
- 一道sizeof的问题
- 一道概率问题
- vue的组件间通信
- SparkStreaming总结下
- 读书笔记 之 《阿里巴巴Java开发手册》
- 攻防实战:使用Lcx进行内网端口转发
- java中String、StringBuilder和StringBuffer初解
- 一道递归问题
- [BZOJ]1115 石子游戏Kam
- hdu 6178 dfs+超神读入挂
- java求1000以内的水仙花数
- LightOJ 1042 Secret Origins(贪心)
- 线程池原理(三):ThreadPoolExecutor
- Java的for循环上界可变性探讨
- java类如何按照某一属性排序
- oracle建表关联外键时报invalid datatype错误