text 计数小号字符串中有多少牛逼子序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了text 计数小号字符串中有多少牛逼子序列相关的知识,希望对你有一定的参考价值。

static int num = 0 ;
public static boolean isSubseq(String t,String s) {
		//判断t是否是s的子序列
		if(t==null) return true;
		if(t.length()==1 && s.contains(t)) return true;
		Map<Character,List> map = new HashMap<>();
		for(int i = 0 ; i < s.length(); i++) {
			if(map.get(s.charAt(i))==null)
				map.put(s.charAt(i), new ArrayList<Integer>());
			map.get(s.charAt(i)).add(i);
		}
		boolean res = isSubseqRecurse(t,s,map,0,-1);
		return res;
	}
	public static boolean isSubseqRecurse(String t,String s,Map<Character,List> map,int cur_pos,int last_pos) {
		if(cur_pos==t.length()){
		  num++;return true;
		}
		List<Integer> list = map.get(t.charAt(cur_pos));
		if(list==null) return false;
		boolean flag = false;
		for(int i = 0 ;  i < list.size(); i++) {
			int cur = list.get(i);
			if(cur<=last_pos) continue;
			else flag |= isSubseqRecurse(t,s,map,cur_pos+1,cur);
		}
		return flag;
	}
看到有关字符串的子序列或者配准类的问题,首先应该考虑的就是用动态规划 Dynamic Programming 来求解,这个应成为条件反射。而所有 DP 问题的核心就是找出状态转移方程,想这道题就是递推一个二维的 dp 数组,其中 dp[i][j] 表示s中范围是 [0, i] 的子串中能组成t中范围是 [0, j] 的子串的子序列的个数。下面我们从题目中给的例子来分析,这个二维 dp 数组应为:
  Ø r a b b b i t
Ø 1 1 1 1 1 1 1 1
r 0 1 1 1 1 1 1 1
a 0 0 1 1 1 1 1 1
b 0 0 0 1 2 3 3 3
b 0 0 0 0 1 3 3 3
i 0 0 0 0 0 0 3 3
t 0 0 0 0 0 0 0 3
首先,若原字符串和子序列都为空时,返回1,因为空串也是空串的一个子序列。若原字符串不为空,而子序列为空,也返回1,因为空串也是任意字符串的一个子序列。而当原字符串为空,子序列不为空时,返回0,因为非空字符串不能当空字符串的子序列。理清这些,二维数组 dp 的边缘便可以初始化了,下面只要找出状态转移方程,就可以更新整个 dp 数组了。我们通过观察上面的二维数组可以发现,当更新到 dp[i][j] 时,dp[i][j] >= dp[i][j - 1] 总是成立,再进一步观察发现,当 T[i - 1] == S[j - 1] 时,dp[i][j] = dp[i][j - 1] + dp[i - 1][j - 1],若不等, dp[i][j] = dp[i][j - 1],所以,综合以上,递推式为:
dp[i][j] = dp[i][j - 1] + (T[i - 1] == S[j - 1] ? dp[i - 1][j - 1] : 0)

以上是关于text 计数小号字符串中有多少牛逼子序列的主要内容,如果未能解决你的问题,请参考以下文章

2021-08-15:给定一个字符串Str,返回Str的所有子序列中有多少不同的字面值。

计算字符串中有多少个整数

动态虚树计数

Google App Engine 分片计数器中有多少个分片?

java 给定Ñ和S,从1〜n的之间多个数之和为小号的序列

MySql TEXT 列的最大字符长度是多少?