题目描述
题解
这道题贪心的思想,我们只需要尽可能多的把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);}
}