当前位置: 首页 > wzjs >正文

公司手机网站建设价格网站seo搜索引擎优化教程

公司手机网站建设价格,网站seo搜索引擎优化教程,长春火车站附近美食,wordpress数字市场汉化文章目录 数字解码为字母的方案计数问题理解解题思路Java实现代码解析测试用例总结 数字解码为字母的方案计数 问题理解 给定一个数字字符串,我们需要计算它可以被解码为字母字符串的所有可能方式。解码规则为: 数字1对应字母’a’数字2对应字母’b’…

文章目录

  • 数字解码为字母的方案计数
    • 问题理解
    • 解题思路
    • Java实现
    • 代码解析
    • 测试用例
    • 总结

数字解码为字母的方案计数

问题理解

给定一个数字字符串,我们需要计算它可以被解码为字母字符串的所有可能方式。解码规则为:

  • 数字1对应字母’a’
  • 数字2对应字母’b’
  • 数字26对应字母’z’

例如,"12258"有5种解码方式:

  1. 1 2 2 5 8 → “abbeh”
  2. 1 2 25 8 → “abyh”
  3. 1 22 5 8 → “aveh”
  4. 12 2 5 8 → “lbeh”
  5. 12 25 8 → “lyh”

解题思路

这个问题可以使用动态规划来解决,关键在于如何处理数字的组合方式:

  1. 基本情况

    • 空字符串有1种解码方式(即空字符串)
    • 单个数字字符(非’0’)有1种解码方式
  2. 递推关系

    • 当前数字可以单独解码(1-9)
    • 当前数字和前一个数字可以组合解码(10-26)
  3. 边界条件

    • 数字’0’不能单独解码
    • 以’0’开头的字符串无法解码

Java实现

public class DecodeWays {public static int numDecodings(String s) {if (s == null || s.length() == 0) {return 0;}int n = s.length();int[] dp = new int[n + 1];dp[0] = 1; // 空字符串有1种解码方式dp[1] = s.charAt(0) == '0' ? 0 : 1; // 第一个字符的解码方式for (int i = 2; i <= n; i++) {// 检查单个数字int oneDigit = Integer.parseInt(s.substring(i - 1, i));if (oneDigit >= 1 && oneDigit <= 9) {dp[i] += dp[i - 1];}// 检查两个数字组合int twoDigits = Integer.parseInt(s.substring(i - 2, i));if (twoDigits >= 10 && twoDigits <= 26) {dp[i] += dp[i - 2];}}return dp[n];}// 优化空间版本public static int numDecodingsOptimized(String s) {if (s == null || s.length() == 0 || s.charAt(0) == '0') {return 0;}int prev1 = 1; // dp[i-1]int prev2 = 1; // dp[i-2]for (int i = 1; i < s.length(); i++) {int current = 0;// 检查单个数字if (s.charAt(i) != '0') {current += prev1;}// 检查两个数字组合int twoDigits = Integer.parseInt(s.substring(i - 1, i + 1));if (twoDigits >= 10 && twoDigits <= 26) {current += prev2;}prev2 = prev1;prev1 = current;}return prev1;}public static void main(String[] args) {System.out.println(numDecodings("12258")); // 输出5System.out.println(numDecodings("226"));   // 输出3System.out.println(numDecodings("06"));    // 输出0System.out.println(numDecodingsOptimized("12258")); // 输出5System.out.println(numDecodingsOptimized("226"));   // 输出3System.out.println(numDecodingsOptimized("06"));    // 输出0}
}

代码解析

  1. 基础动态规划版本

    • 使用dp数组存储中间结果,dp[i]表示前i个字符的解码方式数
    • 检查单个数字(1-9)和两个数字组合(10-26)的可能性
    • 时间复杂度O(n),空间复杂度O(n)
  2. 优化空间版本

    • 仅使用两个变量prev1prev2代替整个dp数组
    • 每次迭代更新当前值并滚动更新前两个状态
    • 时间复杂度O(n),空间复杂度O(1)

测试用例

public static void main(String[] args) {// 常规测试System.out.println(numDecodings("12"));     // 输出2 ("AB"或"L")System.out.println(numDecodings("226"));   // 输出3// 边界测试System.out.println(numDecodings("0"));     // 输出0System.out.println(numDecodings("10"));    // 输出1System.out.println(numDecodings("100"));   // 输出0// 大数测试System.out.println(numDecodings("1111111111111111111111111111"));  // 输出317811
}

总结

这个问题展示了动态规划在字符串解码问题中的典型应用。关键点在于:

  1. 识别数字可以单独或组合解码的两种情况
  2. 正确处理’0’的特殊情况
  3. 通过状态转移方程累计所有可能的解码方式

优化版本在保持相同时间复杂度的同时,将空间复杂度从O(n)降低到O(1),是更优的解决方案。

http://www.dtcms.com/wzjs/275420.html

相关文章:

  • wordpress 笔记本主题下载惠州seo外包服务
  • 58同城招聘 招聘网云南seo简单整站优化
  • 国外域名注册支持支付宝seo自媒体培训
  • 黄岛网站建设百度人气榜排名
  • 做网站公司名字百度系app有哪些
  • 二维码怎么做网站搜索排名查询
  • 天津制作网站的公司电话现在怎么做网络推广
  • 备案 多个网站白云百度seo公司
  • 哪些公司的网站做的漂亮优化大师怎么强力卸载
  • 开发网站的过程深圳20网络推广
  • 上海做网站设计公司营销网站建站公司
  • 第一次做网站做后感seo优化宣传
  • 免费b2b网站大全不花钱我要学电脑哪里有短期培训班
  • 商城网站设计制作信息流广告怎么投放
  • 网站备案 需要上传网站么百度官方网站下载
  • 网站建设犭金手指C排名15重庆网站排名
  • 网站开发技术的现状及发展趋势郑州网络营销学校
  • 树状结构的网站百度快照怎么优化排名
  • 苏州做网站哪家专业京东seo搜索优化
  • 签名设计在线关键词优化快速排名
  • 网站开发与设计专业做一个公司网站要多少钱
  • 做电影网站成本目前小说网站排名
  • cms做淘宝客网站百度竞价排名公式
  • 网站建设单位有哪些内容企业网站推广注意事项
  • abc网站建设怎么样近期新闻热点大事件
  • 做网站的是怎么赚钱的免费的网站推广在线推广
  • 做问卷调查兼职可靠网站实时新闻
  • 我要在58上面做网站今日深圳新闻最新消息
  • 如何给网站做推广重庆排名seo公司
  • 接入网站备案要多久免费网页空间到哪申请