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

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

题目:

将给定的数转换为字符串,原则如下: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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JSP、JavaBean原理和使用

    JSP、JavaBean原理和使用JavaServerPages:Java服务器端页面,也和Servlet一样,用于动态Web技术!最大的特点:写JSP就像在写HTML区别:HTML只给用户提供静态的数据 JSP页面中可以嵌入JAVA代码,为用户提供动态数据;…

    2022年7月12日
    17
  • 全面屏手机时代 指纹识别真的过时了吗吗_全面屏和普通屏哪个好

    全面屏手机时代 指纹识别真的过时了吗吗_全面屏和普通屏哪个好2019独角兽企业重金招聘Python工程师标准>>>…

    2022年8月10日
    7
  • vim复制粘贴_vim的复制粘贴

    vim复制粘贴_vim的复制粘贴vim与系统剪切板(将vim的内容复制到系统剪切板、或将系统剪切板内容复制到vim中)vim插件检查要完成vim中的内容复制到系统剪切板,需要vim支持+clipboard,检查的方法(ubuntu16.04为例):打开terminal(ctl+alt+t)输入vim–version|grepclipboard你会得到这样的结果查看clipboard和xterm_c…

    2022年9月22日
    0
  • [Python人工智能] 九.gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算

    [Python人工智能] 九.gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算从本专栏开始,作者正式开始研究Python深度学习、神经网络及人工智能相关知识。前一篇详细讲解了卷积神经网络CNN原理,并通过TensorFlow编写CNN实现了MNIST分类学习案例。本篇文章将分享gensim词向量Word2Vec安装、基础用法,并实现《庆余年》中文短文本相似度计算及多个案例。本专栏主要结合作者之前的博客、AI经验和相关文章及论文介绍,后面随着深入会讲解更多的Python人工智能案例及应用。基础性文章,希望对您有所帮助~

    2022年6月8日
    29
  • 判断处理器是大端还是小端_网络字节序是大端还是小端

    判断处理器是大端还是小端_网络字节序是大端还是小端最近用杰理AC6966B调试博通的BK9527U段发射芯片,一直没调通,经过测试IIC通讯是通,硬件还是好的,但是怎么都调不到与接收端成功连接。最后咨询原厂得知提供的demo代码是大端编码模式的MCU代码,如果是小端模式,在部分写寄存器操作的过程中,如果直接传指针数据会反掉。杰理的MCU应该是小端模式,平时写代码用memcpy函数操作指针赋值最后得到的结果都是低位在前。为了进一步验证,网上找了一段代码验证,原理跟memcpy给指针赋值是类似的,最后成功验证到杰理的AC,AD系列都是小端模式:

    2022年8月30日
    3
  • mysql json decode_json_decode函数详解

    mysql json decode_json_decode函数详解json_decode是php5.2.0之后新增的一个PHP内置函数,其作用是对JSON格式的字符串进行编码.那么这个函数该如何使用呢?json_decode的语法规则:json_decode(string$json[,bool$assoc=false[,int$depth=512[,int$options=0]]])json_decode接受一个JSON格…

    2022年7月17日
    41

发表回复

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

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