lcr86
++DFS+回溯++
++从字符串起始位置逐步截取子串++,判断子串是否是回文,若是则加入当前分割路径,直到遍历完整个字符串,最终收集所有回文分割的组合。

class Solution
{
string s;
vector<vector<string>> ret;
vector<string> path;
int n;
public:
vector<vector<string>> partition(string s) {
this->s=s;
n=s.size();
dfs(0);
return ret;
}
void dfs(int p)
{
if(p==n)
{
ret.push_back(path);
return;
}
for(int i=p+1;i<=n;i++)
{
string t=s.substr(p,i-p);
//从p位置开始 截取长度
string r=t;
reverse(r.begin(),r.end());
if(r==t)
{
path.push_back(t);
dfs(i);
path.pop_back();//回溯下一种可能
}
}
}
};
lc627
注意到:灯泡状态周期是6 开关周期是4
int init_mask = (1 << n) - 1;
//1111.. open
int m1 = mask ^ ((1 << n) - 1);
//和全1异或 实现取反
for (int i = 0; i < n; i += 3)
m4 ^= (1 << i);//隔3翻转
class Solution {
public:
int flipLights(int n, int presses)
{
n = min(n, 6);
++int init_mask = (1 << n) - 1;++
++//1111.. open++
unordered_set<int> states;
bool memo[101][1<<6] = {false};
auto dfs = [&](this "auto&&")
{
if (ops == 0) {
states.insert(mask);
return;
}
if (memo[ops][mask]) return;
memo[ops][mask] = true;
++int m1 = mask ^ ((1 << n) - 1);++
++//和全1异或 实现取反++
dfs(ops-1, m1);
int m2 = mask;
for (int i = 1; i < n; i += 2) m2 ^= (1 << i);//翻转偶数位
dfs(ops-1, m2);
int m3 = mask;
for (int i = 0; i < n; i += 2) m3 ^= (1 << i);//奇数位
dfs(ops-1, m3);
int m4 = mask;
++for (int i = 0; i < n; i += 3) m4 ^= (1 << i);//隔3翻转++
dfs(ops-1, m4);
};
presses=min(presses,4);
dfs(presses, init_mask);
return states.size();
}
};