题目:1963. 使字符串平衡的最小交换次数
方法一:对于符合要求的字符串,需要任何[0,i]部分,“[”都不比“]”少。[ 视为+1,] 视为-1,那么任何前缀和sum都不能出现sum<0。
当sum<0,说明当前的 ] 需要用 [ 来置换,这里用到贪心,用最右边的 [ 来替换。也就是希望这个当前 ] 带来的-1影响能最晚发生。
C++版本:
class Solution {
public:
int minSwaps(string s) {
int ans=0;
int sum=0;
int j=s.size()-1;
for(auto c:s){
if(c=='['){
sum++;
}else{
if(sum>0){
sum--;
}else{
while(s[j]!='['){
j--;
}
s[j]=']';
sum++;
ans++;
}
}
}
return ans;
}
};
JAVA版本:
class Solution {
public int minSwaps(String s) {
int ans=0;
int sum=0;
char[] c=s.toCharArray();
int j=c.length-1;
for(char x:c){
if(x=='['){
sum++;
}else{
if(sum>0){
sum--;
}else{
while(c[j]!='['){
j--;
}
sum++;
ans++;
}
}
}
return ans;
}
}
方法二:其实置换后,会发现,被置换的位置右边都是 ] ,根本不会有sum<0的情况。因此到这被置换的位置时,肯定sum>0,直接可以提前结束了,所以没必要去修改被置换的位置为 ] 。直接sum++,c++即可。
C++版本:
class Solution {
public:
int minSwaps(string s) {
int ans=0;
int sum=0;
for(auto c:s){
if(c=='['){
sum++;
}else{
if(sum>0){
sum--;
}else{
sum++;
ans++;
}
}
}
return ans;
}
};
JAVA版本:
class Solution {
public int minSwaps(String s) {
int ans=0;
int sum=0;
char[] c=s.toCharArray();
for(char x:c){
if(x=='['){
sum++;
}else{
if(sum>0){
sum--;
}else{
sum++;
ans++;
}
}
}
return ans;
}
}