给定一个由“0”、“1”和“2”组成的字符串。任务是找到最小数量的替换,使得相邻字符不相等。
例子:
Input: s = “201220211”
Output: 2
Resultant string after changes is 201210210
Input: s = “0120102”
Output: 0
方法:该问题已在上一篇文章中使用贪心方法解决。在这篇文章中,我们将讨论解决同一问题的动态规划方法。创建一个函数charVal ,它根据字符返回 0、1 或 2。
生成一个递归函数,它调用 charVal函数来获取第 i 个值,如果这等于前一个值,则在第 i 个字符。如果它不等于前一个,则不进行任何更改。 dp[][] 数组用于记忆。基本情况是当所有职位都被填补时。如果任何状态被重新访问,则返回存储在 dp[][] 数组中的值。 DP[i][j] 表示第 i 个位置被第 j 个字符填充。
下面是上述问题的实现:
C++
// C++ program to count the minimal
// replacements such that adjacent characters
// are unequal
#include
using namespace std;
// function to return integer value
// of i-th character in the string
int charVal(string s, int i)
{
if (s[i] == '0')
return 0;
else if (s[i] == '1')
return 1;
else
return 2;
}
// Function to count the number of
// minimal replacements
int countMinimalReplacements(string s, int i,
int prev, int dp[][3], int n)
{
// If the string has reached the end
if (i == n) {
return 0;
}
// If the state has been visited previously
if (dp[i][prev] != -1)
return dp[i][prev];
// Get the current value of character
int val = charVal(s, i);
int ans = INT_MAX;
// If it is equal then change it
if (val == prev) {
int val = 0;
// All possible changes
for (int cur = 0; cur <= 2; cur++) {
if (cur == prev)
continue;
// Change done
val = 1 + countMinimalReplacements(s, i + 1, cur, dp, n);
ans = min(ans, val);
}
}
else // If same no change
ans = countMinimalReplacements(s, i + 1, val, dp, n);
return dp[i][val] = ans;
}
// Driver Code
int main()
{
string s = "201220211";
// Length of string
int n = s.length();
// Create a DP array
int dp[n][3];
memset(dp, -1, sizeof dp);
// First character
int val = charVal(s, 0);
// Function to find minimal replacements
cout << countMinimalReplacements(s, 1, val, dp, n);
return 0;
}
Java
// Java program to count the minimal
// replacements such that adjacent characters
// are unequal
class GFG
{
// function to return integer value
// of i-th character in the string
static int charVal(String s, int i)
{
if (s.charAt(i) == '0')
{
return 0;
}
else if (s.charAt(i) == '1')
{
return 1;
}
else
{
return 2;
}
}
// Function to count the number of
// minimal replacements
static int countMinimalReplacements(String s, int i,
int prev, int dp[][], int n)
{
// If the string has reached the end
if (i == n)
{
return 0;
}
// If the state has been visited previously
if (dp[i][prev] != -1)
{
return dp[i][prev];
}
// Get the current value of character
int val = charVal(s, i);
int ans = Integer.MAX_VALUE;
// If it is equal then change it
if (val == prev)
{
val = 0;
// All possible changes
for (int cur = 0; cur <= 2; cur++)
{
if (cur == prev)
{
continue;
}
// Change done
val = 1 + countMinimalReplacements(s,
i + 1, cur, dp, n);
ans = Math.min(ans, val);
}
} else // If same no change
{
ans = countMinimalReplacements(s, i + 1,
val, dp, n);
}
return dp[i][val] = ans;
}
// Driver Code
public static void main(String[] args)
{
String s = "201220211";
// Length of string
int n = s.length();
// Create a DP array
int dp[][] = new int[n][3];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
dp[i][j] = -1;
}
}
// First character
int val = charVal(s, 0);
// Function to find minimal replacements
System.out.println(countMinimalReplacements(s, 1,
val, dp, n));
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python 3 program to count the minimal
# replacements such that adjacent characters
# are unequal
import sys
# function to return integer value
# of i-th character in the string
def charVal(s, i):
if (s[i] == '0'):
return 0
elif (s[i] == '1'):
return 1
else:
return 2
# Function to count the number of
# minimal replacements
def countMinimalReplacements(s,i,prev, dp, n):
# If the string has reached the end
if (i == n):
return 0
# If the state has been visited previously
if (dp[i][prev] != -1):
return dp[i][prev]
# Get the current value of character
val = charVal(s, i)
ans = sys.maxsize
# If it is equal then change it
if (val == prev):
val = 0
# All possible changes
for cur in range(3):
if (cur == prev):
continue
# Change done
val = 1 + countMinimalReplacements(s, i + 1, cur, dp, n)
ans = min(ans, val)
# If same no change
else:
ans = countMinimalReplacements(s, i + 1, val, dp, n)
dp[i][val] = ans
return dp[i][val]
# Driver Code
if __name__ == '__main__':
s = "201220211"
# Length of string
n = len(s)
# Create a DP array
dp = [[-1 for i in range(3)] for i in range(n)]
# First character
val = charVal(s, 0)
# Function to find minimal replacements
print(countMinimalReplacements(s, 1, val, dp, n))
# This code is contributed by
# Surendra_Gangwar
C#
// C# program to count the minimal
// replacements such that adjacent
// characters are unequal
using System;
class GFG
{
// function to return integer value
// of i-th character in the string
static int charVal(string s, int i)
{
if (s[i] == '0')
{
return 0;
}
else if (s[i] == '1')
{
return 1;
}
else
{
return 2;
}
}
// Function to count the number of
// minimal replacements
static int countMinimalReplacements(string s, int i,
int prev, int [,]dp, int n)
{
// If the string has reached the end
if (i == n)
{
return 0;
}
// If the state has been visited previously
if (dp[i,prev] != -1)
{
return dp[i,prev];
}
// Get the current value of character
int val = charVal(s, i);
int ans = int.MaxValue;
// If it is equal then change it
if (val == prev)
{
val = 0;
// All possible changes
for (int cur = 0; cur <= 2; cur++)
{
if (cur == prev)
{
continue;
}
// Change done
val = 1 + countMinimalReplacements(s,
i + 1, cur, dp, n);
ans = Math.Min(ans, val);
}
}
else // If same no change
{
ans = countMinimalReplacements(s, i + 1,
val, dp, n);
}
return dp[i,val] = ans;
}
// Driver Code
public static void Main()
{
string s = "201220211";
// Length of string
int n = s.Length;
// Create a DP array
int [,]dp = new int[n,3];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 3; j++)
{
dp[i,j] = -1;
}
}
// First character
int val = charVal(s, 0);
// Function to find minimal replacements
Console.WriteLine(countMinimalReplacements(s, 1,
val, dp, n));
}
}
// This code is contributed by Ryuga
Javascript
输出:
2
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。