题目链接: leetcode.
回溯模板
* def backtrack(路径,选择列表):
* if 满足结束条件:
* result.add(路径)
* return
* for 选择 in 选择列表:
* 做选择
* backtrack(路径,选择列表)
* 撤销选择
当遇到有重复元素求子集时,先对nums
数组的元素排序,再用if(i>start&&nums[i]==nums[i-1])
来判断是否剪枝
/*
执行用时:44 ms, 在所有 C++ 提交中击败了79.39%的用户
内存消耗:19.9 MB, 在所有 C++ 提交中击败了73.45%的用户
*/
class Solution {
public:
vector<string> ans;
void dfs(string s, vector<int>& visit, string tmp)
{
if(s.size() == tmp.size())
{
ans.push_back(tmp);
return;
}
int i = 0;
int N = s.size();
for(int i = 0;i < s.size();++i)
{
if(!visit[i])
{
//剪枝
if(i > 0 && s[i] == s[i - 1] && visit[i-1])
{
continue;
}
visit[i] = 1;
tmp.push_back(s[i]);
dfs(s, visit, tmp);
visit[i] = 0;
tmp.pop_back();
}
}
}
vector<string> permutation(string s) {
if(s.empty())
return {};
int N = s.size();
vector<int> visit(N);
string tmp = "";
sort(s.begin(), s.end()); //排序
dfs(s, visit, tmp);
return ans;
}
};
pop_back()
删除字符串的最后一个字符,有效地将其长度减少一个。
// string::pop_back
#include <iostream>
#include <string>
int main ()
{
std::string str ("hello world!");
str.pop_back();
std::cout << str << '\n'; //hello world
return 0;
}