算法题:求一个序列S中所有包含T的子序列(distinct sub sequence)
题:
给定一个序列S以及它的一个子序列T,求S的所有包含T的子序列。例:
解:
一、求S的子序列
void PrintDistinctSubByFlags(char* seq, int seq_len, bool* seq_flags)
{
printf("\r\n");
char buf[] = " ";
for (int i = ; i < seq_len; ++i)
{
if (seq_flags[i])
{
buf[] = seq[i];
printf(buf);
}
}
} void DistinctSubInner(char* seq, int seq_len, bool* seq_flags, int seq_flags_idx)
{
if (seq_flags_idx >= seq_len)
{
PrintDistinctSubByFlags(seq, seq_len, seq_flags);
return;
} seq_flags[seq_flags_idx] = false;
DistinctSubInner(seq, seq_len, seq_flags, seq_flags_idx + );
seq_flags[seq_flags_idx] = true;
DistinctSubInner(seq, seq_len, seq_flags, seq_flags_idx + );
} void DistinctSub(char* whole_seq)
{
if(!whole_seq || !*whole_seq)
{
return;
} bool* seq_flags = new bool[strlen(whole_seq) + ];
DistinctSubInner(whole_seq, strlen(whole_seq), seq_flags, );
delete seq_flags;
}
void DistinctSubInner(char* whole_seq, char* sub_seq, int sub_seq_len)
{
if (!*whole_seq)
{
PrintDistinctSub(sub_seq_len);
return;
} sub_seq[sub_seq_len] = *whole_seq;
DistinctSubInner(whole_seq + , sub_seq, sub_seq_len + ); // output head of S
DistinctSubInner(whole_seq + , sub_seq, sub_seq_len); // not ouput head of S
} void DistinctSub(char* whole_seq)
{
if(!whole_seq || !*whole_seq)
{
return;
} sub_seq = new char[strlen(whole_seq)];
DistinctSubInner(whole_seq, sub_seq, );
delete sub_seq;
}
二、求S中所有包含T的子序列
void DistinctSubInner(char* whole_seq, char* min_seq, char* sub_seq, int sub_seq_len)
{
if (!*whole_seq)
{
if(!*min_seq)
{
PrintDistinctSub(sub_seq, sub_seq_len);
}
else
{
// unmatch sub sequence
}
return;
} sub_seq[sub_seq_len] = *whole_seq; if (*whole_seq == *min_seq)
{
// 1. output head of S and match head of T
DistinctSubInner(whole_seq + , min_seq + , sub_seq, sub_seq_len + );
} // 2. output head of S but do not match head of T
DistinctSubInner(whole_seq + , min_seq, sub_seq, sub_seq_len + ); // 3. do not ouput head of S
DistinctSubInner(whole_seq + , min_seq, sub_seq, sub_seq_len);
} void DistinctSub(char* whole_seq, char* min_seq)
{
if(!whole_seq || !*whole_seq || !min_seq || !*min_seq)
{
return;
} char* sub_seq = new char[strlen(whole_seq) + ];
DistinctSubInner(whole_seq, min_seq, sub_seq, );
delete sub_seq;
}
三、去重
3.1 是否需要匹配不同位置?
void DistinctSubInner(char* whole_seq, int sub_seq_len)
{
if (!*whole_seq)
{
if(!*min_seq)
{
PrintDistinctSub(sub_seq_len);
}
return;
} sub_seq[sub_seq_len] = *whole_seq; if (*whole_seq == *min_seq)
{
DistinctSubInner(whole_seq + , min_seq + , sub_seq_len + );
}
else
{
DistinctSubInner(whole_seq + , min_seq, sub_seq_len + );
} DistinctSubInner(whole_seq + , sub_seq_len);
}
3.2 如何解决连续相同元素造成的重复解?
void DistinctSubInner(char* whole_seq, int sub_seq_len)
{
if (!*whole_seq)
{
if(!*min_seq)
{
PrintDistinctSub(sub_seq_len);
}
return;
} sub_seq[sub_seq_len] = *whole_seq; if (*whole_seq == *min_seq)
{
DistinctSubInner(whole_seq + , min_seq + , sub_seq_len + );
}
else
{
DistinctSubInner(whole_seq + , min_seq, sub_seq_len + );
} if(sub_seq[sub_seq_len] != sub_seq[sub_seq_len - ])
{
DistinctSubInner(whole_seq + , min_seq, sub_seq_len);
}
}
int main(int argc, _TCHAR* argv[])
{
char* whole_seqs[] = {
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",}; for (int i = ; i < sizeof(whole_seqs) / sizeof(char*); ++i)
{
printf("\r\n\r\ndistinct sub sequence of \"%s\" for \"%s\" : ===============", whole_seqs[i], "");
DistinctSub(whole_seqs[i], "");
} getchar();
}
后话
算法题:求一个序列S中所有包含T的子序列(distinct sub sequence)的更多相关文章
- 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )
1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblo ...
- Expm 10_2 实现Ford-Fulkerson算法,求出给定图中从源点s到汇点t的最大流,并输出最小割。
package org.xiu68.exp.exp10; import java.util.ArrayDeque; import java.util.ArrayList; import java.ut ...
- 求一个集合S中m个元素的所有排列以及一个数组A的全排列—递归实现版完整代码
说明,本文全文代码均用dart语言实现. 求一个集合S中m个元素的所有排列情况,并打印,非常适合用递归的思路实现.本文给出了两种实现方法,一种是给定的填充排列数组长度是固定的,一种是可变长度的.两种方 ...
- Excel-判断一个文本字符串中是否包含数字! 判断一个文本字符串是否是纯汉字!
0.判断一个文本字符串中是否包含数字!/判断一个文本字符串是否是纯汉字! 公式=IF(LENB(A1)=2*LEN(A1),"都是汉字","含有非汉字字符") ...
- 从一道算法题实现一个文本diff小工具
众所周知,很多社区都是有内容审核机制的,除了第一次发布,后续的修改也需要审核,最粗暴的方式当然是从头再看一遍,但是编辑肯定想弄死你,显然这样效率比较低,比如就改了一个错别字,再看几遍可能也看不出来,所 ...
- [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
给定一个数组,求和为定值的所有组合, 这道算法题在leetcode应该算是中等偏下难度, 对三到五年工作经验主要做业务开发的同学来说, 一般较难的也就是这种程度了. 简述经过: 不算hr面,总计四面, ...
- hdu 1394 求一个序列的最小逆序数 单点增 区间求和
题目的意思就好比给出一个序列 如:0 3 4 1 2 设逆序数初始n = 0: 由于0后面没有比它小的,n = 0 3后面有1,2 n = 2 4后面有1,2,n = 2+2 = 4: 所以该序列逆序 ...
- 设计一个算法,求非空二叉树中指定的第k层(k>1)的叶子节点的个数
思想:採用基于层序遍历的方法. 用level扫描各层节点,若某一层的节点出队后.rear指向该层中最右节点.则将rear赋值给last(对于第一层.last=1).在出队时,若front=last,表 ...
- 一道算法题加深我对C++中map函数的理解
一.一道题目引发我对map函数的考量 首先是题目大意:有n个银行,a[i]表示这个人在第i个银行有a[i]块钱(可以是负数),所有银行的钱加起来正好是0.每次只能在相邻的银行之间转账,问最少要转多少次 ...
随机推荐
- 使用 Express 实现一个简单的 SPA 静态资源服务器
背景 限制 SPA 应用已经成为主流,在项目开发阶段产品经理和后端开发同学经常要查看前端页面,下面就是我们团队常用的使用 express 搭建的 SPA 静态资源服务器方案. 为 SPA 应用添加入口 ...
- LeetCode OJ:ZigZag Conversion(字符串的Z字型转换)
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...
- QUnit 学习笔记 使用说明(一)
一.单元测试前言 什么是单元测试? 如果是新接触单元测试的童鞋,简要的解释:就是一个JS函数/功能/模块的测试. 单元测试的工具:这里介绍QUnit Qunit原本是jqury家的,不过现在已经独立了 ...
- javascript 事件委托 event delegation
事件委托 event delegation 一.概念: 假设我们有很多个子元素,每个元素被点击时都会触发相应事件,普通的做法是给每个子元素添加一个事件监听. 而,事件委托则是给它们的父元素添加一个事件 ...
- Mac环境下svn的使用(转)
本文目录 一.创建代码仓库,用来存储客户端所上传的代码 二.配置svn的用户权限 三.使用svn客户端功能 在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下, ...
- C++隐式类类型转化
隐式类类型转换:可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换 class Person { public: Person(): mName()name, mAge ...
- 个人Blog小程序开发完毕
今天忙了一天,算是把这个小程序弄好了,包括小程序前端页面.接口对接.后台系统.服务器架 设.域名备案.证书安装(现在阿里云的免费证书怎么审核要这么久啊,到现在还在审核中) 先上截图: 这个背景图片的替 ...
- 从JDK源码角度看Object
Java的Object是所有其他类的父类,从继承的层次来看它就是最顶层根,所以它也是唯一一个没有父类的类.它包含了对象常用的一些方法,比如getClass.hashCode.equals.clone. ...
- 开源一款资源分享与下载工具 —— 电驴(eMule)
这里分享一款资源分享与下载工具--电驴,其实严格来说,应该叫电骡,这是我维护的版本,eMuleVeryCD版本,VeryCD是一个不错的资源分享网站:http://www.verycd.com/.大概 ...
- 主机屋MySQL数据库链接
点击高级设置,进入Myadmin,导入数据 要注意,数据库名字不能变,这是人家给的. 在php链接时,: $db=[ // 服务器地址 'hostname' => 'localhost', // ...