/*
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:"abbaca"
输出:"ca"
解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
*/
#include <iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string str = "abbaca";
string result;
for (char s : str)
{
if (result.empty()||result.back()!=s)
{
result.push_back(s);
}
else
{
result.pop_back();
}
}
cout << result;
}
/*
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
*/
#include <iostream>
#include<string>
#include<algorithm>
#include<vector>
//#include<map>
//#include<set>
//#include<unordered_set>
#include<stack>
using namespace std;
class Solution {
private:
vector<vector<int>> result; // 存放符合条件结果的集合
vector<int> path; // 用来存放符合条件结果
void backtracking(int n, int k, int startIndex=1)
{
if (path.size() == k)
{
result.push_back(path);
return;
}
for (int i = startIndex; i <= n; i++)
{
path.push_back(i); // 处理节点
backtracking(n, k, i + 1);<