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 列的最大字符长度是多少?