【题目】ProblemD.最长01子串

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;
				}
		}
	}	
}
发布了233 篇原创文章 · 获赞 254 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_44485744/article/details/104993506
今日推荐