subsequence

本文详细介绍了使用动态规划方法解决最长公共子序列问题,包括算法原理、代码实现及输出解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.util.Arrays;


/**
 * @author administ
 *
 */
public class SubSequence {
	
	/**
	 * @param str1  第一个字符串
	 * @param str2 第二个字符串
	 */
	//如果str1[i] == str2[j] 左上
	//如果str1[i] != str2[j] 比较l[i-1][j] 和 l[i][j-1]大小
	void longest(String str1,String str2){
		//m[i][j] 表示 在str1[i],str2[j]时最长子序列选择情况
		//0 表示左         1表示上    2表示左上
		int[][] m = new int[str1.length()+1][str2.length()+1];
		//str1[i] str2[j]时最长子序列长度
		int[][] l = new int[str1.length()+1][str2.length()+1];
		for(int i = 0;i<str1.length();i++){
			l[i][0] = 0;
			m[i][0] = -1;
		}
		for(int j = 0;j<str2.length();j++){
			l[0][j] = 0;
			m[0][j] = -1;
		}

		for(int i=1;i<str1.length()+1;i++){
			for(int j=1;j<str2.length()+1;j++){
				if(str1.charAt(i-1)==str2.charAt(j-1)){
					l[i][j] = l[i-1][j-1]+1;
					m[i][j] = 2;
				}else{
					if(l[i][j-1]>l[i-1][j]){
						l[i][j] = l[i][j-1];
						m[i][j] = 0;
					}
					else {
						l[i][j] = l[i-1][j];
						m[i][j] = 1;
					}
				}
				
			}
		}
		System.out.println(Arrays.deepToString(l));
	}
	public static void main(String[] args) {
		String str2 = "bdcaba";
		String str1 = "abcbdab";
		SubSequence ss = new SubSequence();
		ss.longest(str1, str2);
	}

}




                
### is_subsequence 函数或算法的详细信息 `is_subsequence` 是一种常见的算法或函数,用于判断一个字符串是否为另一个字符串的子序列。具体来说,如果可以通过删除某些字符而不改变其余字符顺序的方式从目标字符串中获得给定的子串,则该子串被认为是目标字符串的一个子序列。 #### 算法描述 此问题通常可以采用双指针技术来解决。两个指针分别指向输入字符串 `s` 和目标字符串 `t` 的起始位置。遍历过程中,当发现匹配时移动到下一个待比较字符的位置;如果没有找到完全匹配的情况,则返回 False 表明 `s` 不是 `t` 的子序列[^1]。 下面是一个 Python 实现的例子: ```python def is_subsequence(s: str, t: str) -> bool: s_idx, t_idx = 0, 0 while s_idx < len(s) and t_idx < len(t): if s[s_idx] == t[t_idx]: s_idx += 1 t_idx += 1 return s_idx == len(s) ``` 在这个例子中,我们初始化了两个索引变量 `s_idx` 和 `t_idx` 来追踪各自字符串中的当前位置。每当遇到相等元素的时候就只推进较小的那个字符串即`s`上的指针,而无论何时都会尝试去读取`t`里的下一位直到完成整个扫描或者提前结束循环因为已经找到了全部所需字母[^2]。 #### 时间复杂度分析 由于每次迭代最多只会增加其中一个索引(`s_idx`, 或者 `t_idx`) ,因此总体时间复杂度为 O(n + m),其中 n 和 m 分别代表字符串 `s` 和 `t` 的长度[^3]。 #### 动态规划视角下的解释 虽然上述解法利用的是贪心策略配合简单的线性扫描即可高效解决问题,但从理论上讲也可以借助动态规划的思想重新构建解决方案——尽管这可能带来不必要的额外开销。例如定义状态转移方程如下所示: 设 f[i][j] 表示考虑前i个字符组成的模式串pattern[:i] 是否能成为文本text[:j] 中某部分连续片段构成的有效子序列关系。那么就有递推公式: f[i][j]=true 如果 pattern[i]==text[j] 并且 f[i−1][j−1]==true; 否则的话只要存在某个 k<j 让得 f[i][k]==true 即可使得当前项成立[^4]. 然而实际操作层面考虑到空间效率等因素一般不会这样去做除非特别需求场景下才如此处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值