IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【Lintcode】676. Decode Ways II -> 正文阅读

[数据结构与算法]【Lintcode】676. Decode Ways II

题目地址:

https://www.lintcode.com/problem/676/

对于一个只含英文大写字母的字符串 s s s,其每个字母可以按照'A' -> 1, ..., 'Z' -> 26来编码。现在给定一个只含 0 ~ 9 0\sim 9 09 ? * ?的字符串 t t t ? * ?可以视为 1 ~ 9 1\sim 9 19的任意一种。问其有多少种解码方式。答案模 1 0 9 + 7 10^9+7 109+7返回。

思路是动态规划。设 f [ k ] f[k] f[k] t t t的前 k k k个字母组成的前缀的解码方式数。那么可以分为两种情况,第一种是最后一个字母单独解码,另一种是最后两个字母一起解码(这需要 k ≥ 2 k\ge 2 k2才可以)。分类讨论即可。代码如下:

public class Solution {
    /**
     * @param s: a message being encoded
     * @return: an integer
     */
    public int numDecodings(String s) {
        // write your code here
        int n = s.length();
        long mod = (long) (1e9 + 7);
        long[] f = new long[n + 1];
        // 空串只能解码为空串
        f[0] = 1;
        for (int i = 1; i <= n; i++) {
            char ch = s.charAt(i - 1), prev = 0;
            if (i >= 2) {
                prev = s.charAt(i - 2);
            }
            
            if (ch == '*') {
                f[i] = (f[i] + 9 * f[i - 1]) % mod;
                
                if (i >= 2) {
                    if (prev == '1') {
                        f[i] = (f[i] + 9 * f[i - 2]) % mod;
                    } else if (prev == '2') {
                        f[i] = (f[i] + 6 * f[i - 2]) % mod;
                    } else if (prev == '*') {
                        f[i] = (f[i] + 15 * f[i - 2]) % mod;
                    }
                }
            } else {
                if (ch != '0') {
                    f[i] = (f[i] + f[i - 1]) % mod;
                }
                
                if (i >= 2) {
                    if (prev == '1') {
                        f[i] = (f[i] + f[i - 2]) % mod;
                    } else if (prev == '2') {
                        if (ch <= '6') {
                            f[i] = (f[i] + f[i - 2]) % mod;
                        }
                    } else if (prev == '*') {
                        if (ch <= '6') {
                            f[i] = (f[i] + 2 * f[i - 2]) % mod;
                        } else {
                            f[i] = (f[i] + f[i - 2]) % mod;
                        }
                    }
                }
            }
        }
        
        return (int) f[n];
    }
}

时空复杂度 O ( l t ) O(l_t) O(lt?)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:24:08  更:2021-09-06 11:25:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:42:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码