dfs|mask^翻转

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 memo1011\<\<6 = {false};

auto dfs = \&(this "auto&&")

{

if (ops == 0) {

states.insert(mask);

return;

}

if (memoopsmask) return;

memoopsmask = 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();

}

};

相关推荐
Jerry2 小时前
LeetCode 28. 找出字符串中第一个匹配项的下标
算法
Jerry3 小时前
LeetCode 459. 重复的子字符串
算法
海石6 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石6 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry8 小时前
LeetCode 151. 反转字符串中的单词
算法
a11177611 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜11 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry11 小时前
LeetCode 541. 反转字符串 II
算法
Jerry11 小时前
LeetCode 344. 反转字符串
算法
搞科研的小刘选手12 小时前
【香港大学主办&IEEE出版】第六届计算机视觉、应用与算法国际学术会议(CVAA 2026)
算法·计算机视觉·应用·学术会议