You are given a string S of length N consisting of characters 'a' and 'b' with additional empty gaps represented by '?'. Your task is to replace every such gap with either an 'a' character or a 'b' character so that the longest fragment of S, consisting only of 'a' characters or 'b' characters, is as short as possible.
For example, for S = "aa??bbb", if you replace "??" with "aa", the longest fragment consisting of equal characters will have length 4: "aaaabbb". You can obtain a better result by replacing "??" with "ba", resulting in "aababbb". Then the longest fragment consisting of equal characters will have length 3.
Write a function:
def solution(s)
that, given a string S of length N, returns the minimum possible length of the longest fragment of S consisting of equal characters after replacing all "?" characters with letters.
Examples:
1. Given S = "aa??bbb", your function should return 3, as explained above.
2. Given S = "a?b?aa?b?a", your function should return 2. Question marks can be replaced in the following way: "aabbaabbaa".
3. Given S = "??b??", your function should return 1.
4. Given S = "aa?b?aa", your function should return 3.
Write an efficient algorithm for the following assumptions:
- string S is made only of the following characters: 'a', 'b' and/or '?';
- N is an integer within the range [1..100,000].
def solution(s)
# write your code in Ruby 2.2
arr = []
prev_char = nil
count = 0
max_count = 0
s.split("").each do |char|
if prev_char.nil?
prev_char = char
count = 1
next
end
if char == prev_char
count += 1
next
end
# prev_char != char
arr.push({char: prev_char, count: count})
if prev_char != "?" and count > max_count
max_count = count
end
prev_char = char
count = 1
end
# push the last one too
arr.push({char: prev_char, count: count})
if prev_char != "?" and count > max_count
max_count = count
end
#puts arr.inspect
#puts max_count
arr.each_with_index do |val, i|
#puts "#{val.inspect} #{i}"
if (val[:char] == "?")
count_q = val[:count]
left_val = i == 0 ? nil : arr[i-1]
right_val = arr[i+1]
next if left_val.nil? or right_val.nil?
next if count_q % 2 == 1 and left_val[:char] == right_val[:char]
next if count_q % 2 == 0 and left_val[:char] != right_val[:char]
min = left_val
if right_val[:count] < min[:count]
min = right_val
end
next if min[:count] > 2 and count_q > 1
min[:count] += 1
max_count = min[:count] if max_count < min[:count]
end
end
[max_count,1].max
end
['aa??aa']
def solution(s)
# write your code in Ruby 2.2
arr = []
prev_char = nil
count = 0
max_count = 0
s.split("").each do |char|
if prev_char.nil?
prev_char = char
count = 1
next
end
if char == prev_char
count += 1
next
end
# prev_char != char
arr.push({char: prev_char, count: count})
if prev_char != "?" and count > max_count
max_count = count
end
prev_char = char
count = 1
end
# push the last one too
arr.push({char: prev_char, count: count})
if prev_char != "?" and count > max_count
max_count = count
end
#puts arr.inspect
#puts max_count
arr.each_with_index do |val, i|
#puts "#{val.inspect} #{i}"
if (val[:char] == "?")
count_q = val[:count]
left_val = i == 0 ? nil : arr[i-1]
right_val = arr[i+1]
next if left_val.nil? or right_val.nil?
next if count_q % 2 == 1 and left_val[:char] == right_val[:char]
next if count_q % 2 == 0 and left_val[:char] != right_val[:char]
min = left_val
if right_val[:count] < min[:count]
min = right_val
end
next if min[:count] >= 2 and count_q > 1
min[:count] += 1
max_count = min[:count] if max_count < min[:count]
end
end
[max_count,1].max
end
def solution(s)
# write your code in Ruby 2.2
arr = []
prev_char = nil
count = 0
max_count = 0
s.split("").each do |char|
if prev_char.nil?
prev_char = char
count = 1
next
end
if char == prev_char
count += 1
next
end
# prev_char != char
arr.push({char: prev_char, count: count})
if prev_char != "?" and count > max_count
max_count = count
end
prev_char = char
count = 1
end
# push the last one too
arr.push({char: prev_char, count: count})
if prev_char != "?" and count > max_count
max_count = count
end
#puts arr.inspect
#puts max_count
arr.each_with_index do |val, i|
#puts "#{val.inspect} #{i}"
if (val[:char] == "?")
count_q = val[:count]
left_val = i == 0 ? nil : arr[i-1]
right_val = arr[i+1]
next if left_val.nil? or right_val.nil?
next if count_q % 2 == 1 and left_val[:char] == right_val[:char]
next if count_q % 2 == 0 and left_val[:char] != right_val[:char]
min = left_val
if right_val[:count] < min[:count]
min = right_val
end
next if min[:count] >= 2 and count_q > 1
min[:count] += 1
max_count = min[:count] if max_count < min[:count]
end
end
[max_count,1].max
end
['aa??aa']
def solution(s)
# write your code in Ruby 2.2
arr = []
prev_char = nil
count = 0
max_count = 0
s.split("").each do |char|
if prev_char.nil?
prev_char = char
count = 1
next
end
if char == prev_char
count += 1
next
end
# prev_char != char
arr.push({char: prev_char, count: count})
if prev_char != "?" and count > max_count
max_count = count
end
prev_char = char
count = 1
end
# push the last one too
arr.push({char: prev_char, count: count})
if prev_char != "?" and count > max_count
max_count = count
end
#puts arr.inspect
#puts max_count
arr.each_with_index do |val, i|
#puts "#{val.inspect} #{i}"
if (val[:char] == "?")
count_q = val[:count]
left_val = i == 0 ? nil : arr[i-1]
right_val = arr[i+1]
next if left_val.nil? or right_val.nil?
next if count_q % 2 == 1 and left_val[:char] == right_val[:char]
next if count_q % 2 == 0 and left_val[:char] != right_val[:char]
min = left_val
if right_val[:count] < min[:count]
min = right_val
end
next if min[:count] >= 2 and count_q > 1
min[:count] += 1
max_count = min[:count] if max_count < min[:count]
end
end
[max_count,1].max
end
['aa??aa']
def solution(s)
# write your code in Ruby 2.2
arr = []
prev_char = nil
count = 0
max_count = 0
s.split("").each do |char|
if prev_char.nil?
prev_char = char
count = 1
next
end
if char == prev_char
count += 1
next
end
# prev_char != char
arr.push({char: prev_char, count: count})
if prev_char != "?" and count > max_count
max_count = count
end
prev_char = char
count = 1
end
# push the last one too
arr.push({char: prev_char, count: count})
if prev_char != "?" and count > max_count
max_count = count
end
#puts arr.inspect
#puts max_count
arr.each_with_index do |val, i|
#puts "#{val.inspect} #{i}"
if (val[:char] == "?")
count_q = val[:count]
left_val = i == 0 ? nil : arr[i-1]
right_val = arr[i+1]
next if left_val.nil? or right_val.nil?
next if count_q % 2 == 1 and left_val[:char] == right_val[:char]
next if count_q % 2 == 0 and left_val[:char] != right_val[:char]
min = left_val
if right_val[:count] < min[:count]
min = right_val
end
next if min[:count] >= 2 and count_q > 1
min[:count] += 1
max_count = min[:count] if max_count < min[:count]
end
end
[max_count,1].max
end
The solution obtained perfect score.
Segments of 'a' or 'b' of equal lengths separated by question marks. N <= 20.