开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (1)
master
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
项目仓库所选许可证以仓库主分支所使用许可证为准
master
分支 (1)
master
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (1)
master
algorithm-study
/
src
/
basic
/
dynamicprogramming
/
ConvertToLetterString.java
algorithm-study
/
src
/
basic
/
dynamicprogramming
/
ConvertToLetterString.java
ConvertToLetterString.java 3.25 KB
一键复制 编辑 原始数据 按行查看 历史
monday-pro 提交于 2022年01月22日 17:43 +08:00 . 从暴力递归到动态规划-数字转字母问题
package basic.dynamicprogramming;
import java.util.Random;
/**
* 规定1和A对应、2和B对应、3和C对应......26和Z对应。
* 那么一个数字字符串比如"111"就可以转化为:"AAA"、 "KA"和"AK"。
* 给定一个只有数字字符组成的字符串str,返回有多少种转化结果。
* <p>
* 微信公众号:Java和算法学习
*
* @author 周一
*/
public class ConvertToLetterString {
public static int number(String string) {
if (string == null || string.length() == 0) {
return 0;
}
return process1(string.toCharArray(), 0);
}
/**
* arr[0...i)上的字符已经转换完成,无需修改
* arr[i...)以后的字符还能自由转换
*
* @param arr 待转换的数组
* @param i 当前转换的位置
* @return arr的i位置及以后还有多少种转换方法
*/
private static int process1(char[] arr, int i) {
// i已经到了最后位置了,说明之前的转换有效,产生了一种转换方法
if (i == arr.length) {
return 1;
}
// 当前单独面对0字符,说明之前的选择不对
if (arr[i] == '0') {
return 0;
}
// i位置单独转换
int p1 = process1(arr, i + 1);
// i位置和i+1位置一起转换
// i+1存在,且i和i+1组成的数字字符小于27
int p2 = i + 1 < arr.length && (arr[i] - '0') * 10 + (arr[i + 1] - '0') < 27 ? process1(arr, i + 2) : 0;
return p1 + p2;
}
/**
* 直接由上面的暴力递归修改
*/
public static int dp(String s) {
if (s == null || s.length() == 0) {
return 0;
}
char[] arr = s.toCharArray();
// 1.根据暴力递归的可变参数i的取值范围,确定动态规划的数组大小
int n = arr.length;
int[] dp = new int[n + 1];
// 2.根据暴力递归的 base case 进行边界赋值
dp[n] = 1;
// 3.将暴力递归的递归过程转换为动态规划
for (int i = n - 1; i >= 0; i--) {
if (arr[i] != '0') {
int p1 = dp[i + 1];
int p2 = i + 1 < n && (arr[i] - '0') * 10 + (arr[i + 1] - '0') < 27 ? dp[i + 2] : 0;
dp[i] = p1 + p2;
}
}
// 4.根据暴力递归主函数的调用,确定动态规划的返回值
return dp[0];
}
public static void main(String[] args) {
int maxLength = 10;
int testTimes = 10000;
for (int i = 0; i < testTimes; i++) {
String s = randomString(maxLength);
if (number(s) != dp(s)) {
System.out.println("Error");
System.out.println(s);
break;
}
}
System.out.println("Finish");
}
// ----------------------------------- 辅助测试的方法 ----------------------------------
public static String randomString(int maxLength) {
Random random = new Random();
int length = (int) ((maxLength + 1) * Math.random());
char[] str = new char[length];
for (int i = 0; i < length; i++) {
str[i] = (char) (random.nextInt(10) + '0');
}
return String.valueOf(str);
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

发行版

暂无发行版

贡献者

全部

语言

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/monday-pro/algorithm-study.git
git@gitee.com:monday-pro/algorithm-study.git
monday-pro
algorithm-study
algorithm-study
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /