ProblemD.最长01子串
题目:
给定只含01的字符串,找出最长平衡子串的长度(平衡串:包含0和1的个数相同),串长最大十万
可以空间换时间
测试数据
01001
输出
1001
测试数据
1000010111000001
输出
00101110/01011100/10111000
解答:
import java.util.Arrays;
import java.util.Scanner;
/*
ProblemD.最长01子串
题目:
给定只含01的字符串,找出最长平衡子串的长度(平衡串:包含0和1的个数相同),串长最大十万
可以空间换时间
测试数据
01001
输出
1001
测试数据
1000010111000001
输出
00101110/01011100/10111000
*/
public class Test{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
String str = scanner.next();
int sum = 0, max = Integer.MIN_VALUE, maxCount = 0;
int[] nums1 = new int[str.length()];//存储前n项和(0换为-1)
int[] nums2 = new int[str.length() * 2 + 1];//存储nums1中元素出现的长度
int[] nums3 = new int[str.length() * 2 + 1];//存储nums1中元素第一次出现的下标
Arrays.fill(nums3, -1);
for(int i = 0; i < str.length(); i++) {
if((str.charAt(i) - '0') == 0) sum += -1;
else sum += 1;
nums1[i] = sum;
if(nums3[sum + nums1.length] == -1) nums3[sum + nums1.length] = i;
nums2[sum + nums1.length] = i - nums3[sum + nums1.length];
}
for(int i = 0; i < nums2.length; i++)
if(nums2[i] > max) {
max = nums2[i];
maxCount = i - nums1.length;
}
for(int i = 0; i < nums1.length; i++)
if(nums1[i] == maxCount) {
System.out.println(str.substring(i + 1, i + 1 + max));
break;
}
}
}
}