每天一道算法练习题--Day03 && dp规划,初遇问题

文章讨论了一道LeetCode题目,即找到字符串中最长的理想子序列,要求相邻字符之间的差值不超过给定的限制。作者分享了自己初次尝试的解法以及遇到的问题,即可能错过最优解。然后,作者引用了一个使用动态规划改进的解决方案,虽然表示尚未完全理解,计划进一步研究。作者意识到需要加强算法学习,并计划通过阅读算法书和实践来提高解题能力。
摘要由CSDN通过智能技术生成

前言

今天这道题没太想出来,不太理解别人的解题思路,早上没太多时间了,写记录下博客,等想清楚了别人的思路,再进行补充

原题链接

2370.最长理想子序列
https://leetcode.cn/problems/longest-ideal-subsequence/

个人做题情况

第一次提交

在这里插入图片描述

对应代码:

class Solution {
    public int longestIdealString(String s, int k) {
        int max = 0;
		//int head;
		for (int i=0;i<s.length();i++){
			//int index = i;
			int head = s.charAt(i);
			int count = 1;
			//int min = s.charAt(i);
			for (int j=i+1;j<s.length();j++){
				if (Math.abs(s.charAt(j) - head) <= k){
					head = s.charAt(j);
					count++;
				}
			}
			if (count > max){
				max = count;
			}
		}
		return  max;
    }
}

产生的问题:

(1)报错问题:
主要原因是直接小白式的一个一个尝试会错过最佳情况
比如: 1-2-4-3-8-9-10-11-12
假设我的最大间距是4,那么我只能最大取到1-2-4 或者8-9-11-12
但其实最大应该是1-2-4-8-9-10-11-12,就是我没有在可取的范围内进行dp尝试。

参考别人的代码

class Solution {
    public int longestIdealString(String s, int k) {
        int dp[] = new int [26];
        int max = 0;
		//int head;
		for (int i=0;i<s.length();i++){
			//int index = i;
			int head = s.charAt(i)-'a';
			int count = 1;
			//int min = s.charAt(i);
			for (int j=0;j<=k;j++){
				int xiaxian = head - j;
                int shangxian = head + j;
                if(xiaxian >= 0 && xiaxian<26){
                    dp[head] = Math.max(dp[head],dp[xiaxian]);
                }
                if(shangxian >= 0 && shangxian<26){
                    dp[head] = Math.max(dp[head],dp[shangxian]);
                }
			}
            dp[head]++;
            max = Math.max(max,dp[head]);
			// if (count > max){
			// 	max = count;
			// }
		}
		return  max;
    }
}

老实说,这个有点没太看懂,等我下午在研究研究里面的含义,来进行补充。。

上述代码含义:

补充

我感觉这样做题还是有些问题的,应该打算过几天我买的平板到了,开始看看算法书,然后在针对看的算法数,进行每天做一道题吧= =~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值