力扣每日一题:最长平衡字符串
开篇
今天的力扣打卡题难度并不是很高,只要能找到其中的规律,还是不难解决的。
题目链接:2609.最长平衡字符串
题目描述
解题思路
1.根据题目要求,每个符合要求的平衡子字符串都有"01"字符串,所以可以利用双指针法,先让两个指针指在"01"中的’0’和’1’
2.然后指向’0’的指针往左走,指向’1’的指针往右走,寻找符合要求的子串长度
3.当发现不符合要求时,让两个指针去寻找下一个"01"字符串,直到指针超过原字符串的长度
代码
class Solution {
public int findTheLongestBalancedSubstring(String s) {
if(s.length() == 0 || s.length() == 1) return 0;
int point0 = 0,point1 = 1;
int max = 0;
while(true){
int len = 0;
while(true){
if(s.charAt(point0) == '0' && s.charAt(point1) == '1') break;
else{
point0++;
point1++;
}
if(point1 >= s.length()) return max;
}
len = 2;
while(true){
point0--;
point1++;
if(point0 >= 0 && point1 < s.length() && s.charAt(point0) == '0' && s.charAt(point1) == '1'){
len += 2;
}
else if(point1 == s.length()) return max > len ? max : len;
else {
max = max > len ? max : len;
break;
}
}
point1++;
point0 = point1 -1;
if(point1 >= s.length()) return max;
}
}
}
其它解法
1.官方题解
class Solution {
public int findTheLongestBalancedSubstring(String s) {
int res = 0;
int n = s.length();
int[] count = new int[2];
for (int i = 0; i < n; i++) {
if (s.charAt(i) == '1') {
count[1]++;
res = Math.max(res, 2 * Math.min(count[0], count[1]));
} else if (i == 0 || s.charAt(i - 1) == '1') {
count[0] = 1;
count[1] = 0;
} else {
count[0]++;
}
}
return res;
}
}
2.神仙解法
三句解决问题,只能说写出这个方法的简直是天才
class Solution {
public int findTheLongestBalancedSubstring(String s) {
String t = "01";
while(s.contains(t)){
t = "0" + t + "1";
}
return t.length() - 2;
}
}