让我们考虑一下祖玛游戏。假设我们在桌子上有一排球,这些球的颜色分别为红色(R),黄色(Y),蓝色(B),绿色(G)和白色(W)。我们也有几个球。
现在,每次我们都可以从侧面选择一个球,然后将其插入行中。然后,如果有一组3个或以上相同颜色的球,则将其除去。继续这样做,直到无法取出更多球为止。
我们必须找到要插入的最小球,以删除桌子上的所有球。如果我们不能去除所有球,则返回-1。
因此,如果输入像“ WRRBBW”,而我们有“ RBW”,则答案将为3。我们可以在RR之后添加R,(WRR [R] BBW),删除后,序列将为(WBBW),然后添加B,因此(WBB [B] W),删除后将为(WW),然后添加W,因此序列将为(WW [W])。这将删除所有球。
为了解决这个问题,我们将遵循以下步骤-
定义一个函数findMinStep(),这将花费s,
s:= s连接“#”
定义大小为26的数组v
对于初始化i:= 0,当i <手的大小,更新(将i增加1)时,执行-
将v [hand [i]-'A']增加1
ret:=调用函数solve(s,v)
返回ret> =如果INF不为零,则使用-1进行检查,否则使用ret
定义一个函数solve(),它将使用s,数组v,
如果s与“#”相同,则-
返回0
ret:= INF
对于初始化i:= 0,j:= 0,当j <s的大小时,更新(j增加1),-
v [x-'A'] = v [x-'A']-需要
ret:= ret的最小值,需要+ solve(s的子串从0到第i个索引)将s的子串从j串联到s的大小– j,v
v [x-'A'] = v [x-'A'] +需要
忽略以下部分,跳至下一个迭代
如果s [i]与s [j]相同,则-
需要:= 3-(j-i)
x:= s [i]
如果需要<= v [x-'A'],则-
i:= j
调用函数过程
如果s与“#”相同,则-
返回0
对于初始化i:= 0,j:= 0,当j <s的大小时,更新(j增加1),-
v [x-'A'] = v [x-'A']-需要
ret:= ret的最小值,需要+ solve(s的子串从0到第i个索引)将s的子串从j串联到s的大小– j,v
v [x-'A'] = v [x-'A'] +需要
忽略以下部分,跳至下一个迭代
如果s [i]与s [j]相同,则-
需要:= 3-(j-i)
x:= s [i]
如果需要<= v [x-'A'],则-
i:= j
返回ret
定义一个函数process(),它需要s,
对于初始化i:= 0,j:= 0,当j <s的大小时,更新(j增加1),-
i:= j
从s删除i,j-i
j:= i-1
忽略以下部分,跳至下一个迭代
如果s [i]与s [j]相同,则-
如果(j-i)> = 3,则-
除此以外
用两个字符串调用findMinStep()以获取答案
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; const int INF = 1e9; class Solution { public: int findMinStep(string s, string hand) { s += "#"; vector <int> v(26); for(int i = 0; i < hand.size(); i++){ v[hand[i] - 'A']++; } int ret = solve(s, v); return ret >= INF ? -1 : ret; } int solve(string s, vector <int>& v){ if(s == "#") return 0; int ret = INF; for(int i = 0, j = 0; j < s.size(); j++){ if(s[i] == s[j]) continue; int need = 3 - (j - i); char x = s[i]; if(need <= v[x - 'A']){ v[x - 'A'] -= need; ret = min( ret, need + solve(s.substr(0,i) + s.substr(j , s.size() - j), v)); v[x - 'A'] += need; } i = j; } process(s); if(s == "#") return 0; for(int i = 0, j = 0; j < s.size(); j++){ if(s[i] == s[j]) continue; int need = 3 - (j - i); char x = s[i]; if(need <= v[x - 'A']){ v[x - 'A'] -= need; ret = min( ret, need + solve(s.substr(0,i) + s.substr(j , s.size() - j), v)); v[x - 'A'] += need; } i = j; } return ret; } void process(string& s){ for(int i = 0, j = 0; j < s.size(); j++){ if(s[i] == s[j]) continue; if((j - i) >= 3){ s.erase(i, j - i); j = i - 1; } else i = j; } } }; main(){ Solution ob; cout << (ob.findMinStep("WRRBBW", "RBW")); }
"WRRBBW", "RBW"
输出结果
3