我想将一个二进制数字字符串分成满足以下两个条件的子字符串
1.子串中0和1的个数必须相等。
2.子串必须将0和1分别组合在一起。
示例 1:
输入:
1100110010
输出:
“1100”、“1100”、“10”、“01”、“01”、“10”、“10”、“0011”
示例 2:
输入:
1100
输出:
“1100”,“10”
我尝试了多种方法,但都失败了。
尝试:
string binaryString = "1100110010";
List<string> substrings = new List<string>();
int startIndex = 0;
int endIndex = 0;
while (endIndex < binaryString.Length)
{
int zeros = 0;
int ones = 0;
endIndex = startIndex;
while (endIndex < binaryString.Length && ((zeros == 0 && ones == 0) || (binaryString[endIndex] == binaryString[endIndex - 1])))
{
if (binaryString[endIndex] == '0')
{
zeros++;
}
else
{
ones++;
}
endIndex++;
}
if (zeros == ones)
{
substrings.Add(binaryString.Substring(startIndex, endIndex - startIndex));
}
startIndex = endIndex;
}
foreach (string substring in substrings)
{
Console.WriteLine(substring);
}
请帮我解决这个问题!
最佳答案
这是一个根据您的条件和测试用例运行的算法:
string entry = "1100110010";
for (int i = 0; i < entry.Length; i++)
for (int j = i; j < entry.Length - 1; j++)
{
string newSub = entry.Substring(i, entry.Length-j);
if (newSub.Length % 2 == 0 && newSub.Length>=2)
{
string subLeft = newSub.Substring(0,newSub.Length/2);
string subRight = newSub.Substring(newSub.Length / 2, newSub.Length / 2);
int leftSum = subLeft.Sum(x => x - '0');
int rightSum = subRight.Sum(x => x - '0');
if ((leftSum == subLeft.Length && rightSum ==0) ||
(rightSum == subRight.Length && leftSum == 0))
Console.WriteLine(newSub);
}
}
说明:
Fors
通过逐个字符分解给定的字符串来帮助获取所有组合。然后我们测试每个子字符串的长度是否为偶数,因为我们要查找的所有对都应该是偶数。接下来,我们将前一个子字符串分成两个相等的部分,并尝试将每个部分的数字相加。如果相加的总和与求和部分的长度相同(例如 111 -> 3,因为它们应该分组)或者总和为 0(例如 000 -> 0),那么这就是我们要查找的子字符串。
关于c# - 从二进制字符串中获取具有相同编号的子字符串。 1 和 0 作为单独的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75853569/