日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 926. 将字符串翻转到单调递增(动态规划)

發布時間:2024/7/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 926. 将字符串翻转到单调递增(动态规划) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

如果一個由 '0' 和 '1' 組成的字符串,是以一些 '0'(可能沒有 '0')后面跟著一些 '1'(也可能沒有 '1')的形式組成的,那么該字符串是單調遞增的。

我們給出一個由字符 '0' 和 '1' 組成的字符串 S,我們可以將任何 '0' 翻轉為 '1' 或者將 '1' 翻轉為 '0'。

返回使 S 單調遞增的最小翻轉次數

示例 1: 輸入:"00110" 輸出:1 解釋:我們翻轉最后一位得到 00111.示例 2: 輸入:"010110" 輸出:2 解釋:我們翻轉得到 011111,或者是 000111。示例 3: 輸入:"00011000" 輸出:2 解釋:我們翻轉得到 00000000。提示: 1 <= S.length <= 20000 S 中只包含字符 '0''1'

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/flip-string-to-monotone-increasing
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

  • 動態規劃,dp0[i]表示在相應字符處以0結束的最小翻轉次數
  • dp1[i]表示在相應字符處以1結束的最小翻轉次數
  • 注意預處理得到前綴 1 的個數,見注釋
class Solution { public:int minFlipsMonoIncr(string S) {int n = S.size();vector<int> one(n);for(int i = 0; i < n; ++i)one[i] = (i > 0 ? one[i-1] : 0) + (S[i]=='1');// 前綴 1 的個數vector<int> dp0(n+1, n), dp1(n+1, n);// dp0[i] 表示 以 0 結束遞增的最小翻轉次數// dp1[i] 表示 以 1 結束遞增的最小翻轉次數dp0[0] = dp1[0] = 0;for(int i = 0; i < n; ++i){if(S[i] == '0')//當前是0{dp0[i+1] = min((i > 0 ? one[i-1] : 0), dp0[i]);//以0結束 , 把前面的 1 都翻過來 or 前面以0結束dp1[i+1] = min(dp0[i], dp1[i])+1;//以1結束, 前面以0或1結束都可以,再把當前0翻轉為1,+1}else//當前是 1{dp0[i+1] = min((i > 0 ? one[i-1] : 0), dp0[i])+1;//以0結束 , 把前面的 1 都翻過來 or 前面以0結束, 再把當前1翻轉為0,+1dp1[i+1] = min(dp0[i], dp1[i]);//以1結束, 前面以0或1結束都可以,}}return min(dp0[n], dp1[n]);} };

12 ms 9.1 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 926. 将字符串翻转到单调递增(动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。