• “黑神话·悟空”免安装在线玩,无视显卡等硬件要求!!
  • √ 游戏免下载安装 √ 5分钟随开随玩 √ 关机不计费!低至¥14.90/月!
🔥进入竞技-直面天命🔥

请用JAVA实现一下代码: 给定一个字符串S,可以对S中的一些字符进行删除,请问需要最少多少次操作可以把S变为好串。 好串定义如下:1)字符串长度为偶数。2)字符串奇数下标i的字符,与字符串i+1下标的字符是一样的

时间2023-09-25 19:54:00 提问来自 陕西省西安市 的网友 分类创作 浏览197
为了解决这个问题,我们可以使用动态规划。我们可以创建一个二维布尔数组dp,其中dp[i][j]表示将字符串S的前i个字符转换为好串所需的最小操作次数。我们可以从左上角开始遍历dp数组,并根据以下规则更新dp值: 1. 如果S[i-1] == S[j],则dp[i][j] = dp[i-2][j-2](如果这两个位置都有效)或min(dp[i-2][j], dp[i-2][j-1], dp[i-2][j-2]) + 1(如果其中一个位置无效)。 2. 如果S[i-1] != S[j],则dp[i][j] = min(dp[i-1][j], dp[i-1][j-1]) + 1。 最后,dp[len(S)][0]将包含将字符串S转换为好串所需的最小操作次数。 以下是实现这个算法的Java代码: ```java public class Solution { public int minOperationsToMakeGood(String S) { int n = S.length(); boolean[][] dp = new boolean[n][n]; dp[0][0] = true; for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { if (S.charAt(i - 1) == S.charAt(j)) { if (j > 0) { dp[i][j] = dp[i - 2][j - 2] || (dp[i - 2][j] && dp[i - 2][j - 1]); } else if (j == 0) { dp[i][j] = (dp[i - 1][j] && (dp[i - 1][j] || dp[i - 1][j + 1])); } else if (j == i) { dp[i][j] = true; } else if (dp[i][j]) { dp[i][j] = (dp[i][j + 1] && (dp[i][j + 1] || dp[i + 1][j + 1])); } else if (!dp[i][j]) { dp[i][j] = (dp[i + 1][j] && (dp[i + 1][j] || dp[i + 1][j + 1])); } } else if (S.charAt(i - 1) != S.charAt(j)) { dp[i][j] = Math.min((dp[i - 1][j] && (dp[i - 1][j] || dp[i - 1][j + 1])), (dp[i][j + 1] && (dp[i][j + 1] || dp[i + 1][j + 1]))); } else if (S.charAt(i - 1) == S.charAt(j)) { dp[i][j] = true; } } } return n % 2 == 0 && S.length() % 2 == 0 && (n == S.length()) && (!dp[n][0]) && (!dp[n][n]) && (!dp[n][n + 1]) && (!dp[n + 1][n]) && (!dp[n + 1][n + 1]) && (!dp[n + 2][n]) && (!dp[n + 2][n + 1]) && (!dp[n + 3][n]) && (!dp[n + 3][n + 1]) && (!dp[n + 4][n]) && (!dp[n + 4][n + 1]); } } ```

点击这里,进行内容创作

创作工场 免责声明:
以上内容除特别注明外均来源于网友提问,创作工场回答,未经许可,严谨转载。
点击这里>>使用🔥专业版,更聪明、更完整、更原创!

上一篇 写一篇关于建国大业的观后感,字数在3000字左右 下一篇 航空发动机压气机盘叶片目前遇到的问题