这是纳斯达克实习编码轮中提出的一个问题。
节目说明:
该程序将二进制字符串作为输入。我们必须连续删除所有字符交替的子序列,直到字符串为空。任务是找到这样做所需的最少步骤数。
示例1:
让字符串为:0111001
Removed-0101, Remaining-110
Removed-10 , Remaining-1
Removed-1
No of steps = 3
示例2 :
让字符串为:111000111
Removed-101, Remaining-110011
Removed-101, Remaining-101
Removed-101
No of steps = 3
示例 3:
让字符串为:11011
Removed-101, Remaining-11
Removed-1 , Remaining-1
Removed-1
No of steps = 3
示例4 :
让字符串为:10101
Removed-10101
No of steps = 1
我尝试的解决方案将二进制字符串的第一个字符视为我的子序列的第一个字符。然后创建一个新字符串,如果下一个字符不是交替序列的一部分,则将在其中附加下一个字符。新字符串成为我们的二进制字符串。以这种方式,循环继续,直到新字符串为空。(有点 O(n^2) 算法)。正如预期的那样,它给了我一个超时错误。在 C++ 中添加一个与我尝试过的代码有点相似的代码,它是用 Java 编写的。
#include<bits/stdc++.h>
using namespace std;
int main() {
string str, newStr;
int len;
char c;
int count = 0;
getline(cin, str);
len = str.length();
//continue till string is empty
while(len > 0) {
len = 0;
c = str[0];
for(int i=1; str[i] != '\0';i++) {
//if alternative characters are found, set as c and avoid that character
if(c != str[i])
c = str[i];
//if next character is not alternate, add the character to newStr
else {
newStr.push_back(str[i]);
len++;
}
}
str = newStr;
newStr = "";
count++;
}
cout<<count<<endl;
return 0;
}
我还尝试了诸如查找相同连续字符的最大子序列的长度之类的方法,这显然不能满足所有情况,例如 example3。
希望有人可以帮助我为这个问题提供最优化的解决方案。最好是 C、C++ 或 python 中的代码。甚至算法也可以。