Это решение не является лучшим с точки зрения оптимизации, но в спешке и стрессе интервью его можно быстро обдумать, нарисовать и объяснить.
Я бы вложил 2 цикла.
1, начиная с 0 до len - 2 (с приращением) (минимальная длина должна быть 2)
1, начиная с len до предыдущего значения цикла + 2 (с уменьшением) (минимальная длина должна быть2)
Получить подстроку соответствующих итераторов циклов
Считать, если символы равны.
, затем, если true, сравнить с длиной сохраненного результата, еслидлина больше, перезапишите результат.
Используя 0100
в качестве примера, который будет проверять эти значения:
// result = ''
0100 //not balanced
010 //not balanced
01 //balanced AND length is greated than result's one. result = '01'
100 //not balanced
10 //balanced BUT length is not greated than result's one
00 //not balanced
Пример JavaScript (я немного подправил его, чтобы оптимизировать числоитераций, но подход тот же):
var iterations = 0;
function IsBalanced(input, char1, char2)
{
if (input.length % 2 != 0) // odd length can't be balanced
{
++iterations;
return (false);
}
let char1count = 0;
let char2count = 0;
let len = input.length;
for (let i = 0; i < len; ++i)
{
++iterations;
if (input[i] == char1)
++char1count;
else
++char2count;
}
return (char1count == char2count);
}
function findLargest(input, char1, char2)
{
let len = input.length;
let result = '';
for (let k = 0; k < len - 1; ++k)
{
// This is a tweak to reduce the number of iterations
// To avoid testing a substring smaller than the current result
// |
// |
// v----------------------v
for (let l = len; l - k > result.length && l > k + 1; --l)
{
tempResult = input.substring(k, l);
if (IsBalanced(tempResult, char1, char2) && tempResult.length > result.length)
result = tempResult;
}
}
return (result);
}
console.log("Input : 1010111 - result : " + findLargest("1010111", "1", "0") + " original size : " + "1010111".length + " - iterations : " + iterations);
iterations = 0;
console.log("Input : ababaaa - result : " + findLargest("ababaaa", "a", "b") + " original size : " + "ababaaa".length + " - iterations : " + iterations);
iterations = 0;
console.log("Input : 00100100 - result : " + findLargest("00100100", "1", "0") + " original size : " + "00100100".length + " - iterations : " + iterations);
iterations = 0;
console.log("Input : 1111100000 - result : " + findLargest("1111100000", "1", "0") + " original size : " + "1111100000".length + " - iterations : " + iterations);
iterations = 0;
console.log("Input : 0001111111111010001111100000000001111111111 - result : " + findLargest("0001111111111010001111100000000001111111111", "1", "0") + " original size : " + "0001111111111010001111100000000001111111111".length + " - iterations : " + iterations);
iterations = 0;
console.log("Input : 0000000000000000000000000000000000000000000000000001 - result : " + findLargest("0000000000000000000000000000000000000000000000000001", "1", "0") + " original size : " + "0000000000000000000000000000000000000000000000000001".length + " - iterations : " + iterations);