给你一个下标从 0 开始的字符串 s ,重复执行下述操作 任意 次: 在字符串中选出一个下标 i ,并使 c 为字符串下标 i 处的字符。并在 i 左侧(如果有)和 右侧(如果有)各 删除 一个距离 i 最近 的字符 c 。 请你通过执行上述操作任意次,使 s 的长度 最小化 。 返回一个表示 最小化 字符串的长度的整数。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/minimize-string-length 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。给你一个下标从 0 开始的字符串 s ,重复执行下述操作 任意 次: 在字符串中选出一个下标 i ,并使 c 为字符串下标 i 处的字符。并在 i 左侧(如果有)和 右侧(如果有)各 删除 一个距离 i 最近 的字符 c 。 请你通过执行上述操作任意次,使 s 的长度 最小化 。 返回一个表示 最小化 字符串的长度的整数。 用哈希写出Java并带注释
时间: 2024-03-04 13:51:05 浏览: 47
```java
class Solution {
public int minimumLength(String s) {
int left = 0, right = s.length() - 1;
while (left < right) {
char c = s.charAt(left);
int l = left, r = right;
// 找到左侧最近的与 c 不同的字符的位置
while (l < r && s.charAt(l + 1) == c) {
l++;
}
// 找到右侧最近的与 c 不同的字符的位置
while (l < r && s.charAt(r - 1) == c) {
r--;
}
// 如果左侧与右侧已经重合,说明无法再删除字符了,直接跳出循环
if (l == r) {
break;
}
// 如果左侧与右侧相邻,那么剩下的字符就无法再删除了,直接返回长度
if (l + 1 == r) {
return 2;
}
// 否则,将左侧、右侧各往中间靠近一位
left = l + 1;
right = r - 1;
}
// 最终剩余的字符串就是最小化后的结果
return right - left + 1;
}
}
```
注释:该算法通过双指针的方式,不断找到左侧与右侧最近的与 c 不同的字符的位置,并将左侧、右侧各往中间靠近一位,直到无法再删除字符或左侧与右侧相邻为止,最终剩余的字符串就是最小化后的结果。时间复杂度为 O(n)。
阅读全文