| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 1052 设计密码(kmp + 状态机模型) -> 正文阅读 |
|
[数据结构与算法]1052 设计密码(kmp + 状态机模型) |
1. 问题描述: 你现在需要设计一个密码 S,S 需要满足: 输入格式 第一行输入整数N,表示密码的长度。第二行输入字符串T,T中只包含小写字母。 输出格式 输出一个正整数,表示总方案数模 10 ^ 9 + 7 后的结果。 数据范围 1 ≤ N ≤ 50, 输入样例1: 2 输出样例1: 625 输入样例2: 4 输出样例2: 456924 2. 思路分析: 这道题目感觉还是挺难的,因为它不像股票问题可以直接看出存在多少个状态,状态之间的转移感觉还是比较隐晦,这道题目其实存在t个状态,我们可以从上一个状态跳到下一个状态,下一个状态可以是"a" - "z",当可以跳的时候我们跳转到下一个状态,我们可以定义一个二维数组dp,其中dp[i][j]表示前i个字符并且和T匹配到第j位的方案数目(动态规划一般的定义方式是考虑前i个....的...),因为涉及到匹配子串是否在某个字符串中,所以我们可以使用kmp算法进行匹配,kmp算法循环停下来的位置就是前i - 1个字符匹配的子串长度u,这样我们就可以计算出当前前i个字符匹配子串中的u个字符的方案数目。使用三层循环枚举即可,第一层循环枚举当前字符串的长度,第二层循环枚举前i个字符串中匹配的子串个数,第三层循环枚举可以跳到的下一个状态。 3. 代码如下:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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 3:19:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |