请问最少多少次操作后,所有的字符都相同?
字符串长度不超过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 }