题目描述
题解
这道题贪心的思想,我们只需要尽可能多的把0变成1,而且进行操作1才能使其变大。观察发现以下几点:
- 不论原字符串有多少个0,最后都会剩余1个0。
- 假设原字符串只有一个0,不能进行任何操作,显然结论成立。
- 假设我们遇到一个0,紧跟着他的是0,那么我们一定会进行操作1,才能得到最大的,即变成10;
- 假设我们遇到一个0,遇到若干个1,然后再遇到0。即01…10,这种情况我们就需要从右往左处理,使得我们能进行操作1(使高位变成1)。显然进行若干次操作2,0的个数不变,然后进行一次操作1,0的个数变为1。
- 第一个0的位置是idx,那么后边出现cnt个0,最后剩余的1个0的位置就向右移到cnt位,即idx + cnt - 1。要使最后得到的字符串最大,那么一定是进行了操作1,结论显然成立。
代码实现
class Solution {
public String maximumBinaryString(String binary) {
int idx = binary.indexOf('0');
if(idx < 0){
return binary;
}
int n = binary.length(), cnt = 0;
char[] c = new char[n];
for(int i = 0; i < n; i ++){
if(binary.charAt(i) == '0'){
idx ++;
}
c[i] = '1';
}
c[idx - 1] = '0';
return new String(c);
}
}