请问最少多少次操作后,所有的字符都相同?
字符串长度不超过1000。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return int整型
*/
int minOperations(string str) {
// write code here
int n = str.size();
if(n == 0 || n == 1)return 0;
if(n == 2)return str[0] == str[1]?0:1;
vector<int>dp0(n,0);
vector<int>dp1(n,0);
if(str[0] == str[1]){
if(str[0] == '0'){
dp1[0]= 1;
dp1[1]= 1;
}
else{
dp0[0]=1;
dp0[1]=1;
}
}
else{
if(str[0] == '0'){
dp0[1]=1;
dp1[0]=1;
dp1[1]=1;
}else{
dp1[1]=1;
dp0[0]=1;
dp0[1]=1;
}
}
for(int i =2;i<n;++i){
if(str[i] == '0'){
dp1[i] = min(dp1[i-1],dp1[i-2])+1;
dp0[i] = dp0[i-1];
}else{
dp0[i] = min(dp0[i-1],dp0[i-2])+1;
dp1[i] = dp1[i-1];
}
}
return min(dp0[n-1],dp1[n-1]);
}
}; class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return int整型
*/
int minOperations(string str) {
// write code here
int do0=0, do1=0;
int i=0;
while(i<str.size()){
int st = i;
if(str[i]=='0'){
while(i<str.size() && str[i]=='0'){
++i;
}
do0 += (i-st)/2;
do0 += (i-st)%2;
}
else{
while(i<str.size() && str[i]=='1'){
++i;
}
do1 += (i-st)/2;
do1 += (i-st)%2;
}
}
return min(do0, do1);
}
}; import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return int整型
*/
public int minOperations (String str) {
int[] arr = new int[str.length()];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.valueOf(String.valueOf(str.charAt(i)));
}
int d0 = 0;
for (int i = 0; i < arr.length;) {
if (arr[i] == 0) {
i++;
} else {
d0++;
i += 2;
}
}
int d1 = 0;
for (int i = 0; i < arr.length;) {
if (arr[i] == 1) {
i++;
} else {
d1++;
i += 2;
}
}
return Math.min(d0, d1);
}
} 没学过dp 这里使用模拟的方法,转成1需要多少步 转成0需要多少步。返回最小值即可
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return int整型
*/
public int minOperations (String str) {
// write code here
int count0 = findMinCount(str, '0');
int count1 = findMinCount(str, '1');
return Math.min(count0, count1);
}
private int findMinCount(String str, char num) {
int count = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) != num) {
if (i + 1 < str.length() && str.charAt(i + 1) != num) {
count++;
i++; // 两个都不是0 只需要一次操作 所以i++跳过后面的字符
} else if (i + 1 < str.length() && str.charAt(i + 1) == num) {
count++;
} else if (i +1 == str.length()) {
count++;
}
}
}
return count;
}
}
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param str string字符串 # @return int整型 # class Solution: def minOperations(self , s: str) -> int: # write code here return min(self.getop(s, '1'), self.getop(s, '0')) def getop(self, s: str, delimter: str): terms = [term for term in s.split(delimter) if term] cnt = 0 for term in terms: cnt += (len(term) + 1) >> 1 return cnt
class Solution {
public:
int minOperations(string str) {
// 把连续 00 11 变成 0 1 再判断 0 1 总的最小个数
for(int i=0; i<str.size()-1;++i)
{
if(str[i]=='0'){
if(str[i+1]=='0')
str[i+1]=' ';
}
if(str[i]=='1'){
if(str[i+1]=='1')
str[i+1]=' ';
}
}
int n = str.size();int num0=0, num1=0;
if(str[str.size()-1] == str[str.size()-2])n--;
for(int i=0; i<=n-1; ++i)
{
if(str[i]=='0')
num0++;
if(str[i]=='1')
num1++;
}
return num0<=num1?num0:num1;
}
}; import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param str string字符串
* @return int整型
*/
public int minOperations (String str) {
// write code here
int n = str.length();
/*
从最后一个字符往前加字符,
dp[i][0]代表为[i,n-1]范围的字符串全部转为字符'0'的最少操作次数,
dp[i][1]代表为[i,n-1]范围的字符串全部转为字符'1'的最少操作次数。
因为一次可以选2个字符,use[i]代表i和i+1字符相同,而且被用于同时改变。
当往前加的str[i]为'0':
那么全部转换为'0'不用操作,dp[i][0]=dp[i+1][0];
全部转换为'1'分两种情况:
1、如果后面的str[i+1]也是为'0',而且没有被用于组合,那么str[i]可以和str[i+1]组合一起变为'1',
那么跟后面str[i+1]全部变为'1'的最少操作数一样,dp[i][1]=dp[i+1][1];
2、不是第1种情况,那么自己就要单独变为'1',最少操作数+1,dp[i][1]=dp[i+1][1]+1。
当往前加的str[i]为'1':
跟'0'的情况一样的逻辑。
另一个数可以用+1取模2获得。
*/
int[][] dp = new int[n][2];
dp[n-1][(str.charAt(n-1) - '0' + 1)%2] = 1;
boolean[] use = new boolean[n];
for(int i=n-2;i>=0;i--){
int num = str.charAt(i) - '0';
dp[i][num] = dp[i+1][num];
int anotherNum = (num + 1) % 2;
if(str.charAt(i) == str.charAt(i+1) && use[i+1] == false){
dp[i][anotherNum] = dp[i+1][anotherNum];
use[i] = true;
}else{
dp[i][anotherNum] = dp[i+1][anotherNum] + 1;
}
}
return Math.min(dp[0][0],dp[0][1]);
}
} class Solution {
public:
int minOperations(string str) {
int zeros = 0;
int ones = 0;
for(int i = 0; i < str.size(); ++i){
if(str[i] == '0')
zeros++;
else
ones++;
if(i < str.size() && str[i + 1] == str[i])
++i;
}
return min(zeros, ones);
}
}; import java.util.*;
public class Solution {
public int minOperations (String str) {
int res0 = 0, res1 = 0;
// 全变为1的情况
char[] tmp = str.toCharArray();
for (int i = 0; i < tmp.length; i++) {
if (tmp[i] != '1') {
res1++;
i++;
}
}
// 全变为0的情况
for (int i = 0; i < tmp.length; i++) {
if (tmp[i] != '0') {
res0++;
i++;
}
}
return Math.min(res0, res1);
}
} package _12月在家重刷.题目;
import java.util.Arrays;
/**
* @author qxm
* @create 2023-02-21 19:37
**/
/*
思路:全变成0,全变成1取二者较小。
如何计算需要的最小次数?
以1001101为例:
全变成0,把1去掉,[00,0],需要ceil("00".length/2)+ceil("0".length/2)
全变成1,把0去掉,[1,11,1],需要ceil("1".length/2)+ceil("11".length/2)+ceil("1".length/2)
二者取较小者
*/
public class _T13_01串修改 {
public static void main(String[] args) {
int res = new _T13_01串修改().minOperations("1001101");
System.out.println(res);
}
public int minOperations(String str) {
//全为0
int ans0 = 0;
String[] split0 = str.split("[0]+");
//System.out.println(Arrays.toString(split0));
for (int i = 0; i < split0.length; i++) {
if (split0[i].length() % 2 == 0) {
ans0 += split0[i].length() / 2;
} else {
ans0 += split0[i].length() / 2 + 1;
}
}
//System.out.println(ans0);
//全为1
int ans1 = 0;
String[] split1 = str.split("[1]+");
//System.out.println(Arrays.toString(split1));
for (int i = 0; i < split1.length; i++) {
if (split1[i].length() % 2 == 0) {
ans1 += split1[i].length() / 2;
} else {
ans1 += split1[i].length() / 2 + 1;
}
}
//System.out.println(ans1);
return Math.min(ans0, ans1);
}
}
func minOperations( str string ) int {
r1, r2 := 0, 0
pre := 0
// 模拟结果为全1,需要的操作次数
for i := range str {
if str[i] == '1' {
pre = 0
} else {
// 如果有连续不为0, 注意连续的两可以变成一个操作
// 例如 1 0 0 0 1 -> 1 1 1 1 1
// 当 i = 1 时, pre = 1
// i = 2 时, pre = 0
// i = 3 时, pre = 1
pre = (pre + 1) % 2
r1 += pre
}
}
// 模拟结果为全0,需要的操作次数, 与上诉类似
for i := range str {
if str[i] == '0' {
pre = 0
} else {
pre = (pre + 1) % 2
r2 += pre
}
}
// 返回两种结果中较小的那个
return min(r1, r2)
}
func min(a, b int) int {
if a < b {
return a
}
return b
}