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

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

题目:

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


相关推荐

  • python中保留小数位数_python取小数部分

    python中保留小数位数_python取小数部分一.format方法a=1.23455print(format(a,’.2f’))print(format(a,’.4f’))符合四舍五入print(‘{:.2f}{:.3f}’.format(1.23455,1.23455))使用{}作为占位符,可以同时操作多个数字二.’%2f’%f方法a=1.23455print(‘%.4f’%a)符合四舍五入三.round()方法a=1.23455print(round(a,2))print(round(a,4))

    2022年8月12日
    6
  • Java Swing 图形界面开发简介

    Java Swing 图形界面开发简介JavaSwingGUI 图形界面窗口开发基础教程 本教程将系统性地详细介绍 Swing 开发中常用的一些组件 布局管理器等相关知识技术 并且每章节都将通过代码实例展示实际应用 Swing 是 Java 为图形界面应用开发提供的一组工具包 是 Java 基础类的一部分 Swing 包含了构建图形界面 GUI 的各种组件 如 窗口 标签 按钮 文本框等 Swing 提供了许多比 AWT 更好的屏幕显示元素 使用纯 Java 实现 能够更好的兼容跨平台运行 JavaSwing 图形界面开发目录

    2025年10月16日
    2
  • Java–LinkedList真的比ArrayList添加元素快?Open JDK JMH带你揭开真相「建议收藏」

    Java–LinkedList真的比ArrayList添加元素快?Open JDK JMH带你揭开真相「建议收藏」【学习背景】欢迎进来学习的小伙伴~不管你是学生,还是职场小白,还是入行1~3年的小伙伴,相信很多小伙伴在面试Java工作岗位时,发现LinkedList和ArrayList这个问题基本是必面的一道题,【面试场景】当面试官问到LinkedList和ArrayList的区别时,可能很多准备得不够充分的小伙伴第一反应的回答仅仅是这样的:LinkedList底层数据结构是链表,添加和删除元素效率比ArrayList高~ArrayList底层数据结构是数组,查询效率比LinkedList高~面试官:哦

    2022年7月11日
    21
  • 安卓端口占用_查看端口号命令

    安卓端口占用_查看端口号命令android查看端口号被占用

    2022年7月27日
    6
  • Winscp连接不上Kali

    Winscp连接不上Kali解决Winscp无法连接kali的问题

    2025年11月13日
    2
  • html发布页,发布页入口.html

    html发布页,发布页入口.html发布页入口$axure.utils.getTransparentGifPath=function(){return’resources/images/transparent.gif’;};$axure.utils.getOtherPath=function(){return’resources/Other.html’;};$axure.utils.getReloadPat…

    2022年5月26日
    119

发表回复

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

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