子序列与子串的区别

子序列:从从字符串中删除一些字符后不更改剩余字符串字符顺序而生成的序列!
子 串:原序列中必须连续的一段!

code:

#include <vector>
#include <string>
#include <iostream>
using namespace std;void print_vec(const vector<string>& str);//--------------------------------------- subsets ---------------------------------------
//求字符串的非空子序列 —— 非空子序列个数 = 2^n-1;(n为字符个数)
void subsequence_1(string& str)
{vector<string> res;     //存储答案int len = str.length();int state_num = 1 << len;for (int i = 0; i < state_num; ++i){string sub_str_set = "";for (int j = 0; j < len; ++j){if ((1 << j) & i){sub_str_set += str[j];}}if (sub_str_set != "")     //过滤掉空子序列!{res.emplace_back(sub_str_set);}}print_vec(res);
}void subsequence_2(string& str, vector<string>& res, int start, int end, string cur_str)
{//递归的结束条件if (start == end){return;}//打印当前字符串排列//std::cout << cur_str << std::endl;res.emplace_back(cur_str);for (int i = start + 1; i < end; ++i){cur_str += str[i];subsequence_2(str, res, i, end, cur_str);cur_str = cur_str.erase(cur_str.length() - 1);}
}//生成全部子序列(包含空序列)
vector<string> subsequence_3(string& str, int index, string path, vector<string>& ans)
{if (index == str.size()){ans.push_back(path);return ans;}else{subsequence_3(str, index + 1, path, ans);subsequence_3(str, index + 1, path + str[index], ans);}return ans;
}//-------------------------------------- substring --------------------------------------
//求字符串的子串   —— 子字符串的个数 = n*(n+1)/2
void substring_1(string& str)
{vector<string> ans;int len = str.length();int window_size = 0;     //记录窗口大小for (; window_size <= len; ++window_size)  //滑动窗口的变化{for (int i = window_size; i < len; ++i){string _str = "";for (int j = window_size; j >= 0; --j){_str += str[i - j];}ans.emplace_back(_str);}}print_vec(ans);
}void substring_2(string& str)
{vector<string> ans;int len = str.length();for (int i = 0; i < str.length(); ++i)   //遍历字符串{for (int j = i + 1; j <= len; ++j){ans.emplace_back(str.substr(i, j - i));}}print_vec(ans);
}//打印函数
void print_vec(const vector<string>& str)
{for (auto& _str : str){std::cout << _str << "  ";}std::cout << std::endl << std::endl;
}int main()
{string str_subsequence_1 = "mnopq";subsequence_1(str_subsequence_1);std::cout << std::endl << std::endl;vector<string> res;string cur_str = "";string str_subsequence_2 = "uvwxyz";subsequence_2(str_subsequence_2, res, 0, str_subsequence_2.size(), cur_str);print_vec(res);std::cout << std::endl << std::endl;vector<string> res_1;string str_3 = "1234";vector<string> ans = subsequence_3(str_3, 0, "", res_1);   //ans的大小为2^(str_3.size())print_vec(ans);//--------------------------------------string str_substring_1 = "abcde";substring_1(str_substring_1);std::cout << std::endl << std::endl;string str_substring_2 = "hijkl";substring_2(str_substring_2);system("pause");return 0;
}

“子序列”与“子串”详解相关推荐

  1. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  2. python【数据结构与算法】最长公共子串详解(附代码)

    文章目录 1 定义 1 定义 和最长公共子序列一样,使用动态规划的算法. 下一步就要找到状态之间的转换方程. 和LCS问题唯一不同的地方在于当A[i] != B[j]时,res[i][j]就直接等于0 ...

  3. 2017蓝桥杯B组:最长公共子序列(动态规划详解(配图))

    最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和"baabcdadabc", 可以找到的最长的公共子串 ...

  4. [蓝桥杯]蓝肽子序列(c++详解)

    这是一道求最长公共子串的题,首先得是公共子串,其次是长度得最长,再求其个数. 我们可以运用动态规划求解这题,设dp[i][j]的值为第一个序列的前i个子序列与第二个序列的前j个子序列的的最长公共子序列 ...

  5. 求序列最长不下降子序列_最长不下降子序列nlogn算法详解

    今天花了很长时间终于弄懂了这个算法--毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ 这篇文章是在懂了这个问题n^2解决方案的基础上学习. 解决的问题:给定一个序列,求最长不下降子 ...

  6. 详解动态规划最长公共子序列--JavaScript实现

    前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...

  7. 动态规划设计方法详解最长递增子序列

    很多读者反应,就算看了前文动态规划详解,了解了动态规划的套路,也不会写状态转移方程,没有思路,怎么办?本文就借助「最长递增子序列」来讲一种设计动态规划的通用技巧:数学归纳思想. 最长递增子序列(Lon ...

  8. 最长公共子序列 - 北京大学郭炜 动态规划代码详解

    最长公共子序列 - 北京大学郭炜 动态规划代码详解 解题思路: 该题可用动态规划解决.动态规划需要我们找出子问题. 假设我们输入两个字符串: ACTTGACC CGTT 那么如何通过动态规划算出其最大 ...

  9. 20200118:(leetcode)最长回文子串(中心扩展算法详解及思考)

    最长回文子串(中心扩展算法详解及思考) 题目 中心扩展算法详解 代码实现 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: " ...

最新文章

  1. python脚本 数据库压力测试_python-网站压力测试脚本
  2. linux基础命令学习
  3. android studio 链接编辑,Android Studio怎么连接手机测试程序?
  4. PermGen space处理方法1
  5. QUIC 之类的可靠传输协议
  6. 关于java结构中描述正确的是_下列关于Java中类的构造方法的描述,正确的是()...
  7. 百度大脑EasyMonitor升级2.0,全新发布软硬一体方案EM-BOX 边缘部署易集成
  8. css的重置和原子类的使用
  9. 12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置 12.16 Nginx代理
  10. SecureCRT的Backspace显示为^H的解决办法
  11. 前端实现文件下载的功能
  12. 德赛西威280b升级_车载导航刷机:德赛西威NAV280H固件升级
  13. ubuntu18.04卸载Anaconda3
  14. pdf格式如何压缩文件大小?
  15. opencv之扩展模块安装
  16. ImportError: DLL load failed while importing shell: 找不到指定的模块。
  17. Septentrio板卡接收机连接方式
  18. 【数据科学赛】CAIL 2022 #八赛道 #NLP #文本匹配 #信息抽取
  19. 基于java的智能计算器_基于Java的语音计算器实现
  20. c#物联网_毕业季我与你招聘信息中移物联网

热门文章

  1. 乐视mysql面试题
  2. a7100换电池_三星A7100拆机更换屏幕教程方法
  3. jQuery阻止冒泡事件的方法
  4. firfox 浏览器在新标签中打开收藏网址设置
  5. infraworks渲染问题汇总
  6. 博客中常见的时钟插件
  7. 第四章:虚拟机监控工具
  8. Misfit推出Swarovski Shine,科技朝着快时尚一路狂奔
  9. matlab从文件夹名中获得该文件夹下所图像文件名
  10. 【数据分析与挖掘实战】电信用户流失分析与预测