每日蓝桥一题:244_最长子序列

1.题目

2.题解

package 刷题记录;

import java.util.Scanner;

public class 最长公共子序列_244 {
public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String str1 = scanner.nextLine();
		String str2 = scanner.nextLine();
		char S[] = str1.toCharArray();
		char T[] = str2.toCharArray();
		//来控制T的索引值
		int index = 0;
		for (int i = 0; i < S.length; i++) {
			//如果S[i] == T[index],T[index]继续往下走,与S[i]继续判断。
			if (S[i] == T[index]) index++;
		}
		System.out.println(index);
	}
}

3.总结

就是用index变量来控制T[m]数组的索引值,当S[i] == T[index]时,index++。

4.疑惑

当我看到这道题时,我首先考虑使用动态规划方法求解最长公共子序列。然而,我在测试中发现我的代码没有通过任何一个测试点,这让我感到困惑,并且不知道出了什么问题。

我个人的思路如下,请指教是否存在问题:

4.1例题图解

4.2代码展示

package 刷题记录;

import java.util.Scanner;

public class 最长子序列_未解决 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String S = scanner.next();
		String T = scanner.next();
		System.out.println(f(S,T));
	}
	static int f(String str1 , String str2) {
		char ch1[] = str1.toCharArray();
		char ch2[] = str2.toCharArray();
		//1.这是为什么要长度加1呢?
        //因为要在c1[0]与c2[0]加一个单位的空子串。
		int a[][] = new int[ch1.length+1][ch2.length+1];
		//2.为什么是从1开始呢?
        //是因为 空子串与任何单位子串 都是0,所以空子串的行和列这两行都是0。
		for (int i = 1; i < ch1.length+1; i++) {
			for (int j = 1; j < ch2.length+1; j++) {
				//3.注意ch1[i-1]和ch2[j-1]的下标是要 -1 的
				//当ch1[i-1] == ch2[j-1]时,a[i][j] = a[i-1][j-1] + 1,即左斜上角 + 1;
				if (ch1[i-1] == ch2[j-1] ) {
					a[i][j] = a[i-1][j-1] + 1; 
				//4.当ch1[i-1] != ch2[j-1]时,Math.max(a[i-1][j], a[i][j-1]),即取左边或上边的最大值;
				}else {
					a[i][j] = Math.max(a[i][j-1], a[i-1][j]); 
				}
			}
		}
		//5.返回二维数组最后一个元素就是最长子序列的长度
		return a[ch1.length][ch2.length];
	}
}

5.期望

以上是我与你分享的题目,以及我的疑惑。如果你能指点出其中存在的问题或错误,我将不胜感激。谢谢!

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值