Minimum replacements in a string to make adjacent characters unequal
Last Updated :
29 Apr, 2021
Given a lowercase character string str of size N. In one operation any character can be changed into some other character. The task is to find the minimum number of operations such that no two adjacent characters are equal.
Examples:
Input: Str = “caaab”
Output: 1
Explanation:
Change the second a to any other character, let’s change it to b. So the string becomes “cabab”. and no two adjacent characters are equal. So minimum number of operations is 1.
Input: Str = “xxxxxxx”
Output: 3
Explanation:
Replace ‘x’ at index 1, 3 and 5 to ‘a’, ‘b’, and ‘c’ respectively.
Approach: The idea is similar to implement sliding window technique. In this, we need to find the non-overlapping substrings that have all the characters the same. Then the minimum operations will be the sum of the floor of half the length of each substring.
- There is no need to change a character directly. Instead, consider all substring started from any index having only one character.
- Now consider any substring of length l such that all the characters of that substring are equal then change floor ( l / 2) characters of this substring to some other character.
- So just iterate over all the characters of the string from any character ch find out the maximal length of the substring such that all the characters in that substring are equal to the character ch.
- Find the length l of this substring and add floor ( l / 2) to the ans.
- After that start from the character just next to the end of the above substring.
C++14
#include <bits/stdc++.h>
using namespace std;
void count_minimum(string s)
{
int n = s.length();
int ans = 0;
int i = 0;
while (i < n) {
int j = i;
while (s[j] == s[i] && j < n) {
j++;
}
int diff = j - i;
ans += diff / 2;
i = j;
}
cout << ans << endl;
}
int main()
{
string str = "caaab" ;
count_minimum(str);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void count_minimum(String s)
{
int n = s.length();
int ans = 0 ;
int i = 0 ;
while (i < n)
{
int j = i;
while (j < n && s.charAt(j) ==
s.charAt(i))
{
j++;
}
int diff = j - i;
ans += diff / 2 ;
i = j;
}
System.out.println(ans);
}
public static void main(String[] args)
{
String str = "caaab" ;
count_minimum(str);
}
}
|
Python3
def count_minimum(s):
n = len (s)
ans = 0
i = 0
while i < n:
j = i
while j < n and (s[j] = = s[i]):
j + = 1
diff = j - i
ans + = diff / / 2
i = j
print (ans)
if __name__ = = "__main__" :
str = "caaab"
count_minimum( str )
|
C#
using System;
class GFG{
static void count_minimum( string s)
{
int n = s.Length;
int ans = 0;
int i = 0;
while (i < n)
{
int j = i;
while (j < n && s[j] == s[i])
{
j++;
}
int diff = j - i;
ans += diff / 2;
i = j;
}
Console.WriteLine(ans);
}
static void Main()
{
string str = "caaab" ;
count_minimum(str);
}
}
|
Javascript
<script>
function count_minimum(s) {
var n = s.length;
var ans = 0;
var i = 0;
while (i < n) {
var j = i;
while (s[j] === s[i] && j < n) {
j++;
}
var diff = j - i;
ans += parseInt(diff / 2);
i = j;
}
document.write(ans + "<br>" );
}
var str = "caaab" ;
count_minimum(str);
</script>
|
Time Complexity: O (N)
Auxiliary Space: O (1)
Share your thoughts in the comments
Please Login to comment...