热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

leecode解题总结:91.DecodeWays

#include<iostream>#include<stdio.h>#include<vector>#include<unordered
#include 
#include 
#include 
#include 
#include 
using namespace std;
/*
问题:
A message containing letters from A-Z is being encoded to numbers using the following mapping:

'A' -> 1
'B' -> 2
...
'Z' -> 26
Given an encoded message containing digits, determine the total number of ways to decode it.

For example,
Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).

The number of ways decoding "12" is 2.

分析:题目对字符A到Z进行1到26的转换,现在给定数字,要求反推得原先的字母组成的不同字符串的个数
A:1,G:7,H:8,I:9,J:10,...,Z:26
也就是两位数(11~26,其中不包括20,因为0不能在个位数对应的字母中找到)的解码会产生两种情况:把这个数字认为
是两位数,或者拆分成两个一位数。
1】凡是遇到当前数为0,一定需要和前面的数字组成一个二位数,
2】凡是遇到数字3到9,必然不会和后面的数字组成二位数来解码。
也就是说我们可以对字符串进行分割:
1】遇到0,0和前面的数字将当前字符串分割成两部分,每部分递归求总数
2】遇到3~9,如果前面是1可以组合;2只能和0到6搭配。单独将两边拆分成各个子串进行
这样太麻烦了。
直接在递归中设定一个合法数的范围,判定如果当前字符串的长度为1或2的时候对应的数字是否在合法数范围中,如果不是,返回该种解码
总数为0;如果是,看是否能同时组成一位数或二位数
设dp[i]表示字符串从s[1]到s[i]所能得到的解码总数。
但是这样会发现,一旦有新字符加入进来会对前面的解码总数有影响,

发现:如果采用字符串分割统计的话,有的会被重复统计:
比如1120,拆分后,变成1,1,20,统计了一次,而先拆分为11,20算作两次

leecode解法:https://leetcode.com/problems/decode-ways/?tab=Solutions
有点类似于上台阶问题,每次只能走一步或两布。
我们可以设定dp[i]表示长度为i的字符串的解码个数,
如果i-1位置上的字符为1~9,dp[i] += dp[i-1]
如果i-2到i-1两个字符组成的数字在10~26,dp[i] += dp[i-2]
牛逼,每次只考虑当前字符前面两个字符的组合情况

输入:
12
10
1120
1121
输出:
2
1
2
5

关键:
1 有点类似于上台阶问题,每次只能走一步或两布。
我们可以设定dp[i]表示长度为i的字符串的解码个数,
如果i-1位置上的字符为1~9,dp[i] += dp[i-1]
如果i-2到i-1两个字符组成的数字在10~26,dp[i] += dp[i-2]
牛逼,每次只考虑当前字符前面两个字符的组合情况
*/

class Solution {
public:

    int numDecodings(string s) {
		if(s.empty())
		{
			return 0;
		}
		int len = s.length();
		vector dp(len + 1 , 0);
		dp.at(0) = 1;//起始位置设定只有一种解法
		dp.at(1) = s.at(0) != '0' ? 1 : 0;//如果为0,肯定不行
		int second;
		string sSecond;
		char firstChar;
		for(int i = 2 ; i <= len ; i++)
		{
			firstChar = s.at(i-1);
			sSecOnd= s.substr(i-2 , 2);//截取第i-2和i-2字符
			//等同于包含了对于当前字符i前面两个字符的组合请款判断
			secOnd= atoi((char*)sSecond.c_str());
			if('1' <= firstChar && firstChar <= '9')
			{
				dp[i] += dp[i-1];
			}
			if(10 <= second && second <= 26)
			{
				dp[i] += dp[i-2];
			}
		}
		return dp[len];
    }
};

void process()
{
	 string value;
	 Solution solution;
	 while(cin >> value )
	 {
		 int result = solution.numDecodings(value);
		 cout < 
 

推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
author-avatar
just路人周
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有