本文主要是介绍不含 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;// 找到连续的aaaif (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();}
这篇关于不含 AAA 或 BBB 的字符串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!