子序列与子串的区别
子序列:从从字符串中删除一些字符后不更改剩余字符串字符顺序而生成的序列!
子 串:原序列中必须连续的一段!
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;
}