刷题 编写一个函数,给出可以转换的不同字符串的个数。 …

刷题 编写一个函数,给出可以转换的不同字符串的个数。 …

题目:

将给定的数转换为字符串,原则如下:1对应 a,2对应b,…..26对应z,例如12258可以转换为”abbeh”, “aveh”, “abyh”, “lbeh” and “lyh”,个数为5,编写一个函数,给出可以转换的不同字符串的个数。

这是第二课第三题

两种解法:暴力递归和动态规划

#include<iostream>
#include<string>
#include<vector>
using namespace std;

//产生一个10000-100000的随机数
int CreatRandomNum(){
	/*
	要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 
	要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 
	要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 
	*/
	return (rand()%90000)+10000;
}

//暴力递归
int Process(string input, int index){
        //只有空串时会遇到这种情况,所以返回唯一的一种情况,空串
	if(index==input.length()) return 1;
        //如果当前位置的值为0,则没办法转成任何字母
	if(input[index]=='0') return 0;
    
        //此时该位置不为0 ,则肯定有结果。res的值为当前的解以及第index+1到最后的那一段字符串的结果的和
	int res=Process(input, index+1);
         //此时遇到了字符串的结尾,无法再继续往下递归了,因此染回结果res
	if(index==input.length()-1) return res;
         //如果当前位置和其后面的位置的数字组合不大于26,说明两个数可以组合出一种情况
         //此时res要加上index+2到结尾的情况
	if(((input[index]-'0')*10+input[index+1]-'0')<27)
		res+=Process(input, index+2);

	return res;
}

//动态规划
int dp(string input){
	//初始长度为input.length()+1,因为有可能会有空串的情况
	//应该把该结果放在动态规划数组索引位置为input.length()的位置,因此初始化长度为input.length()+1
	vector<int>con(input.length()+1);
	//把空串的情况存放在空串会发何时能的对应位置上
	//空串的时候,只有一种结果,所以此时的值为1
	con[input.length()]=1;
	//最后一位如果是0,则此处无解,否则此处是一种字母,结果为1
	con[input.length()-1]=input[input.length()-1]=='0'?0:1;

	for(int i=input.length()-2; i>=0; i--){
		if(input[i]=='0') con[i]=0;
		else
			con[i]=con[i+1]+
				(((input[i]-'0')*10+(input[i+1]-'0'))<27?con[i+2]:0);
	}
	return con[0];
}

int main(){
	
	//把数字转成字符串
	string input=to_string (CreatRandomNum());

	//暴力递归
	//cout<<Process(input, 0)<<endl;
		
	//动态规划
	//cout<<dp(input)<<endl;
   	cout<<input<<endl; 
    Process(input, 0)==dp(input)?cout<<"good"<<endl:cout<<"fucking !!! fuck!!!"<<endl;
    
	return 0;
}

虽然做出来了,但是感觉有点夹生。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101277.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PyCharm Flask框架安装

    PyCharm Flask框架安装打开命名行窗口 执行下面命令 pipinstallfl pipinstallfl login pipinstallfl openid pipinstallfl sqlalchemy pipinstallsq migrate pipinstallfl whooshalche

    2025年8月31日
    4
  • 目标检测的目的_小目标检测问题

    目标检测的目的_小目标检测问题我们在评价一个目标检测算法的“好坏”程度的时候,往往采用的是pascalvoc2012的评价标准mAP。网上一些资料博客参差不齐,缺乏直观易懂的正确说明。希望这篇博文能够给大家一点帮助。mAP历史目标检测的mAP计算方式在2010年的voc上发生过变化,目前基本都是采用新的mAP评价标准。(我有个小疑问就是明明是2010年修改的,但是貌似现在大家都称这种计算方式为2012)所…

    2022年10月12日
    3
  • 一个简单的Parallel.ForEach实现

    一个简单的Parallel.ForEach实现在.net的TaskParallelLibrary中有一个很方便的功能Parallel.ForEach,可以实现多任务的并发执行,另外还带着栅栏功能,非常好用。但是这一功能必须需要clr4.0支持(CTP版的不大好用),对于低版本的.net要实现类似功能只有自己写一个了。codeproject上面文章PoorMan’sParallel.ForEachIterator中就有一种简单而…

    2022年7月19日
    10
  • java中jbpm工作流_java activity工作流

    java中jbpm工作流_java activity工作流第一步:导入jbpm需要的jar包第二步:导入需要的配置文件:jbpm.cfg.xml,jbpm.hibernate.cfg.xml,logging.propertiesjbpm.hibernate.cfg.xml:

    2025年10月15日
    4
  • python deepcopy_python中的深拷贝(deepcopy)和浅拷贝(copy)介绍及代码参考「建议收藏」

    python deepcopy_python中的深拷贝(deepcopy)和浅拷贝(copy)介绍及代码参考「建议收藏」在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。以下分两个思路来分别理解浅拷贝和深拷贝:(1)利用切片操作和工厂方法list方法拷贝(2)利用copy中的deepcopy方法进行拷贝1、利用切片操作和工厂方法list方法拷贝代码场景:有一个小伙jack,tom通过切片操作拷贝jack,anny通…

    2022年10月2日
    2
  • 0xc000007b报错(win10 0xc000007b蓝屏)

    最后更新:2019-3-23请大家首先确定已经按照原文的方法及步骤尝试过,但是还是没有解决问题再来看这篇文章。如果你还没有看过原文,请先看原文:http://blog.csdn.net/VBcom/article/details/6070705看到这里的朋友,应该是看了原文但是没有解决问题。其实这个问题基本上就是由DirectX引起,但是…

    2022年4月10日
    98

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号