不含 AAA 或 BBB 的字符串

给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中。

在此过程之后,我们得到一些数组 B

返回 B 的最大值和 B 的最小值之间可能存在的最小差值。

示例 1:

输入:A = [1], K = 0
输出:0
解释:B = [1]

思路1:先将字符串全部置为“aaaa...” 或 "bbbbb..." ,再查找连续的"aaa"或"bbb",并将连续的进行修改。

	 public String strWithout3a3b(int A, int B) 
	 {
		 StringBuilder sBuilder = new StringBuilder();
		 int temp = 0;
		 
		 char longer = A >= B ? 'a' : 'b'; // 较长的子串
		 char shorter = A < B ? 'a' : 'b'; // 较短的子串
		 int shortLen = A < B ?  A : B; // 较短子串长度
		 
		 // 先将子串全部变成较长子串
		 int total = A + B;
		 while (total > 0)
		 {
			 sBuilder.append(longer);
			 total--;
		 }
		 
		 char[] array = sBuilder.toString().toCharArray();
		 String subStr = new StringBuilder().append(longer)
				 .append(longer).append(longer).toString();
		 int k = array.length-1; // 最后一个字符的位置
		 int lastIdx = 0;
		 // 查找连续子串
		 while (shortLen != 0)
		 {
			 int idx = sBuilder.toString().indexOf(subStr, lastIdx);
			 lastIdx = idx + 3;
			 // 找到连续的aaa
			 if (idx != -1)
			 {
				 array[idx+2] = shorter;
				 shortLen--;
			 }
			 else
			 {
				 // 找到第一个不是shorter的位置
				 while (array[k] == shorter)
				 {
					 k--;
				 }
				 array[k] = shorter;
				 k--;
				 shortLen--;
			 }
		 }
		 return new String(array);
	 }

思路2:贪心策略。

	 public String strWithout3a3b(int A, int B)
	 {
		 StringBuilder ans = new StringBuilder();
		 int L = 0; 
		 boolean writeA = false;
		 while (A > 0 || B > 0)
		 {
			 writeA = false; // 是否写'a'
			 L = ans.length();
			
			 // 先写'a'的条件(贪心策略)
			 if (L >= 2 && (ans.charAt(L-1) == ans.charAt(L-2)))  // 连续两个字符相同
			 {
				 if (ans.charAt(L-1) == 'b')// 末尾是'bb'
					 writeA = true;
			 }
			 else
			 {
				 if ( A >= B) // 先写较长的字符
					 writeA = true;
			 }
			 
			 // 开始写'a'或写'b'
			 if (writeA)
			 {
				 A--;
				 ans.append('a');
			 }
			 else
			 {
				 B--;
				 ans.append('b');
			 }
		 }
		 return ans.toString();
	 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值